2011-12-07 13 views
18

Próbuję otworzyć plik w ramach funkcji Rcpp, więc potrzebuję nazwy pliku jako char * lub std :: string.convert Rcpp :: CharacterVector na std :: string

Dotychczas próbowałem następujące:

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

Ale widocznie as nie działa Rcpp::CharacterVector jak pojawia się błąd czasu kompilacji.

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 

Czy istnieje prosty sposób na pobranie łańcucha z argumentu lub jakoś otwarcie pliku z argumentu funkcji Rcpp?

+2

czy Rcpp :: as (ff) działa? –

+0

@IanFellows, tak, to działa! – highBandWidth

Odpowiedz

22

Rcpp::as() oczekuje, że jako dane wejściowe wprowadzono SEXP, a nie jako Rcpp::CharacterVector. Spróbuj przekazując parametr f1 bezpośrednio do Rcpp::as(), np:

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

czyli

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

'Rcpp :: as ' działa zarówno z 'SEXP' i' Rcpp :: CharacterVector' – highBandWidth

15

Prawdziwym problemem jest to, że Rcpp::as wymaga, aby określić typ, który chcesz przekonwertować do ręcznie, takiego jak Rcpp::as<std::string>.

Dane wejściowe wszystkich przeciążeń as są zawsze SEXP, więc kompilator nie wie, którego użyć i nie może podjąć decyzji automatycznie. dlatego musisz mu pomóc. Rzeczy działają inaczej w przypadku wrap, które mogą używać typu danych wejściowych, aby zdecydować, które przeciążenie będzie używane.