2011-12-07 14 views
18

Estoy tratando de abrir un archivo dentro de una función Rcpp, por lo que necesito el nombre de archivo como char * o std :: string.convertir Rcpp :: CharacterVector a std :: cadena

Hasta ahora, he intentado el siguiente:

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

Pero, al parecer, as no funciona para Rcpp::CharacterVector como me sale un error de tiempo de compilación.

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 

¿Hay una forma sencilla de obtener una cadena a partir del argumento o de alguna manera abrir un archivo desde el argumento de la función RCPP?

+2

¿funciona Rcpp :: como (ff)? –

+0

@IanFellows, sí, ¡eso funciona! – highBandWidth

Respuesta

22

Rcpp::as() espera SEXP como entrada, no Rcpp::CharacterVector. Trate de pasar el parámetro f1 directamente a Rcpp::as(), por ejemplo:

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

O:

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

'Rcpp :: as ' funciona con 'SEXP' y' Rcpp :: CharacterVector' – highBandWidth

15

El verdadero problema es que Rcpp::as requiere que se especifique el tipo que desea convertir en forma manual, como Rcpp::as<std::string>.

La entrada de todas las sobrecargas as es siempre SEXP por lo que el compilador no sabe cuál usar y no puede tomar la decisión automáticamente. es por eso que debes ayudarlo. Las cosas funcionan de manera diferente para wrap que puede usar el tipo de entrada para decidir qué sobrecarga usará.