Rcpp CharacterVector:为什么不是单个元素std :: strings?

时间:2014-04-25 01:44:59

标签: string r rcpp

这可能是一个愚蠢的问题,但我认为CharacterVector的每个元素都是std::string。但是,这不起作用:

std::string hello(CharacterVector vec) {
   std::string result = vec[0];
   return result;
}

错误:候选构造函数不可行:没有已知的从'Proxy'(又名'string_proxy< 16>')到'const_pointer'(又名'const char *')的第一个参数的转换

如果是这样,我们应该在获得std::string之类的C ++好处之前强制转换为empty()

1 个答案:

答案 0 :(得分:5)

有时您需要帮助编译器。

转换器Rcpp::as<T>()从 R转换,转换器Rcpp::wrap()转换为 R.

R> cppFunction('std::string hello(CharacterVector vec) { 
                                return as<std::string>(vec[0]); }')
R> hello(c("The", "quick", "brown", "fox"))
[1] "The"
R> 

这都记录在案,并且有大量的例子。很可能找到更智能的模板编程来自动化这种转换,如果是这样,我们很乐意看到补丁。

对于问题的第二部分:这些来自R,不知道或有std::string。我们有轻量级的包装类,通常避免复制。因此Rcpp::CharacterVector - 您可以转换为std::vector<std::string>

编辑2016年末:请注意,我们也可以

R> cppFunction("std::string f(CharacterVector x,int i) {return std::string(x[i]);}")
R> foo(c("The", "quick", "brown", "fox"), 1)
[1] "quick"
R>