2011-12-07 11 views
18

Sto tentando di aprire un file all'interno di una funzione Rcpp, quindi ho bisogno del nome del file come char * o std :: string.convertire Rcpp :: CharacterVector in std :: string

Finora, ho provato quanto segue:

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

Ma a quanto pare, as non funziona per Rcpp::CharacterVector mentre ottengo un errore di tempo di compilazione.

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 

C'è un modo semplice per ottenere una stringa dall'argomento o in qualche modo aprire un file dall'argomento della funzione Rcpp?

+2

fa Rcpp :: as (ff) funziona? –

+0

@IanFellows, sì, funziona! – highBandWidth

risposta

22

Rcpp::as() prevede un SEXP come input, non un Rcpp::CharacterVector. Prova a passare il parametro f1 direttamente a Rcpp::as(), ad esempio:

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

Oppure:

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

'Rcpp :: as ' funziona con 'SEXP' e' Rcpp :: CharacterVector' – highBandWidth

15

Il vero problema è che Rcpp::as richiede di specificare il tipo che si desidera convertire manualmente, come ad esempio Rcpp::as<std::string>.

L'input di tutti gli overload as è sempre un SEXP in modo che il compilatore non sappia quale utilizzare e non possa prendere la decisione automaticamente. è per questo che devi aiutarlo. Le cose funzionano diversamente per wrap che può usare il tipo di input per decidere quale sovraccarico userà.

Problemi correlati