为什么将std::unordered_map
用作函数参数不能编译(以及如何解决)?
第一个函数将std::unordered_map
作为函数参数,但无法编译
library(Rcpp)
cppFunction(
code = 'void test( std::unordered_map< std::string, std::string > um ) {
}'
, plugins = "cpp11"
)
在函数的主体中声明就可以了
cppFunction(
code = 'void test( ) {
std::unordered_map< std::string, std::string > um;
}'
, plugins = "cpp11"
)
我已成功将其用作我的spatialwidget
库中的函数参数here in an inline函数
感谢Ralf Stubner的解释。总之,当使Rcpp函数可被R调用时,必须具有对象的等效R表示形式。
此代码失败,因为R中没有等效的unordered_map
// [[Rcpp::export]]
void test( std::unordered_map< std::string, std::string > um ) {
}
通过,是因为未将其调用/导出到R
void test( std::unordered_map< std::string, std::string > um ) {
}
答案 0 :(得分:4)
您可以使用std::vector
和std::list
之类的函数作为函数参数,并可以从R 调用的函数中返回值,因为存在Rcpp::as
的适当专业知识和Rcpp::wrap
在这些C ++数据结构和R知道的SEXP
之间(两个方向)之间进行转换。现在,R没有像本机地图一样的数据类型(尽管可以使用命名列表进行某种扩展),这(可能)是为什么Rcpp没有std::unordered_map
的内置转换的原因。对于只能从C ++调用的函数没有这种限制,这就是您的“额外”示例起作用的原因。
原则上,您可以自己定义此类转换函数,请参见c.f。 http://gallery.rcpp.org/articles/custom-templated-wrap-and-as-for-seamingless-interfaces/及其参考。但是,您首先必须决定要在R端使用哪种数据结构。