2011-12-07 17 views
18

私はRcpp関数内でファイルを開くしようとしていますので、私がchar *またはSTDとしてファイル名を必要とする::文字列。Rcppを変換する:: CharacterVector先はstd ::文字列

はこれまでのところ、私は次のことを試してみました:

#include <Rcpp.h> 
#include <boost/algorithm/string.hpp> 
#include <fstream> 
#include <string> 

RcppExport SEXP readData(SEXP f1) { 
    Rcpp::CharacterVector ff(f1); 
    std::string fname = Rcpp::as(ff); 
    std::ifstream fi; 
    fi.open(fname.c_str(),std::ios::in); 
    std::string line; 
    fi >> line; 
    Rcpp::CharacterVector rline = Rcpp::wrap(line); 
    return rline; 
} 

しかし、私は、コンパイル時エラーを取得して明らかに、asRcpp::CharacterVectorのために動作しません。

foo.cpp: In function 'SEXPREC* readData(SEXPREC*)': 
foo.cpp:8: error: no matching function for call to 'as(Rcpp::CharacterVector&)' 
make: *** [foo.o] Error 1 

引数から文字列を取得するか、何らかの理由でRcpp関数の引数からファイルを開く方法はありますか?

+2

はRcpp :: (FF)として動作しますか? –

+0

@IanFellows、うん、それは動作します! – highBandWidth

答えて

22

Rcpp::as()は、入力としてSEXP、ないRcpp::CharacterVector期待します。例えば、Rcpp::as()に直接f1パラメータを渡して試してみてください。

std::string fname = Rcpp::as(f1); 

または:

std::string fname = Rcpp::as<std::string>(f1); 
+2

'Rcpp :: としては、' 'SEXP'と' Rcpp :: CharacterVector'の両方で動作します – highBandWidth

15

本当の問題はRcpp::asは、あなたがそのようなRcpp::as<std::string>として、あなたが手動に変換するタイプを指定することを必要とすることです。

すべてのasオーバーロードの入力は常にSEXPです。したがって、コンパイラはどちらを使用するのかを認識せず、自動的に決定を行うことはできません。それがあなたがそれを助ける必要がある理由です。 wrapでは、入力タイプを使用してどのオーバーロードを使用するかを決める方法が異なります。

関連する問題