Подтвердить что ты не робот

Конвертировать 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?

4b9b3361

Ответ 1

Rcpp::as() ожидает вход SEXP, а не Rcpp::CharacterVector. Попробуйте передать параметр f1 непосредственно на Rcpp::as(), например:

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

Или:

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

Ответ 2

Реальная проблема заключается в том, что Rcpp::as требует, чтобы вы указали тип, который хотите преобразовать вручную, например Rcpp::as<std::string>.

Ввод всех перегрузок as всегда равен SEXP, поэтому компилятор не знает, какой из них использовать и не может принять решение автоматически. зачем вам это нужно. Вещи работают по-разному для wrap, которые могут использовать тип ввода, чтобы решить, какую перегрузку он будет использовать.