2011-12-07 107 views
18

我試圖在Rcpp函數中打開一個文件,所以我需要文件名作爲char *或std :: string。將Rcpp :: CharacterVector轉換爲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

does Rcpp :: as (ff)work? –

+0

@IanFellows,這是有效的! – highBandWidth

回答

22

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 '同時適用於'SEXP'和'Rcpp :: CharacterVector' – highBandWidth

15

真正的問題是,Rcpp::as需要您指定要手動轉換的類型,如Rcpp::as<std::string>

所有as重載的輸入始終是SEXP,因此編譯器不知道要使用哪一個,也不能自動做出決定。這就是爲什麼你需要幫助它。對於wrap,情況會有所不同,它可以使用輸入類型來決定使用哪個過載。