23

Rcpp関数内でファイルを開こうとしているので、ファイル名を char* または std::string にする必要があります。

これまでのところ、次のことを試しました。

#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;
}

しかし、コンパイル時にエラーが発生するasため、明らかに機能しません。Rcpp::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 関数の引数からファイルを開く簡単な方法はありますか?

4

2 に答える 2

28

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

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

または:

std::string fname = Rcpp::as<std::string>(f1); 
于 2011-12-07T20:49:11.207 に答える
16

実際の問題は、Rcpp::as変換するタイプを手動で指定する必要があることです(など)Rcpp::as<std::string>

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

于 2012-11-09T18:43:46.947 に答える