2011-12-07 42 views
18

Tôi đang cố mở một tệp trong hàm Rcpp, vì vậy tôi cần tên tệp là chuỗi char * hoặc std ::.chuyển đổi Rcpp :: CharacterVector thành std :: string

Cho đến nay, tôi đã thử như sau:

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

Nhưng dường như, as không làm việc cho Rcpp::CharacterVector khi tôi nhận được một lỗi thời gian biên dịch.

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ó cách nào đơn giản để lấy chuỗi từ đối số hoặc bằng cách nào đó mở tệp từ đối số hàm Rcpp không?

+2

không Rcpp :: làm (ff) hoạt động? –

+0

@IanFellows, yup, hoạt động! – highBandWidth

Trả lời

22

Rcpp::as() hy vọng là SEXP làm đầu vào, không phải là Rcpp::CharacterVector. Hãy thử đi qua các tham số f1 trực tiếp đến Rcpp::as(), ví dụ:

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

Hoặc:

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

'Rcpp :: là ' hoạt động với cả 'SEXP' và' Rcpp :: CharacterVector' – highBandWidth

15

Vấn đề thực sự là Rcpp::as đòi hỏi bạn phải xác định loại bạn muốn chuyển đổi bằng tay, chẳng hạn như Rcpp::as<std::string>.

Đầu vào của tất cả các quá tải as luôn là SEXP do đó trình biên dịch không biết sử dụng và không thể đưa ra quyết định tự động. đó là lý do tại sao bạn cần phải giúp nó. Mọi thứ hoạt động khác nhau cho wrap có thể sử dụng kiểu đầu vào để quyết định quá tải sẽ sử dụng.

Các vấn đề liên quan