我正在尝试在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函数参数中打开文件?
答案 0 :(得分:24)
Rcpp::as()
期望SEXP
作为输入,而不是Rcpp::CharacterVector
。尝试将f1
参数直接传递给Rcpp::as()
,例如:
std::string fname = Rcpp::as(f1);
或者:
std::string fname = Rcpp::as<std::string>(f1);
答案 1 :(得分:16)
真正的问题是Rcpp::as
要求您手动指定要转换为的类型,例如Rcpp::as<std::string>
。
所有as
重载的输入始终为SEXP
,因此编译器不知道使用哪一个并且无法自动做出决定。这就是你需要帮助它的原因。 wrap
的工作方式不同,它可以使用输入类型来决定它将使用哪个重载。