Преобразовать Rcpp::CharacterVector в std::string
Я пытаюсь открыть файл в функции 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?
2 ответа
Rcpp::as()
ожидает SEXP
в качестве входа, а не Rcpp::CharacterVector
, Попробуйте передать f1
параметр напрямую Rcpp::as()
Например:
std::string fname = Rcpp::as(f1);
Или же:
std::string fname = Rcpp::as<std::string>(f1);
Настоящая проблема в том, что Rcpp::as
требует, чтобы вы указали тип, который вы хотите преобразовать вручную, например Rcpp::as<std::string>
,
Ввод всех as
перегрузки всегда SEXP
поэтому компилятор не знает, какой из них использовать, и не может принять решение автоматически. Вот почему вам нужно помочь. Вещи работают по-другому для wrap
который может использовать тип ввода, чтобы решить, какую перегрузку он будет использовать.