函数参数中的unordered_map

时间:2019-06-05 07:45:08

标签: r rcpp

问题

为什么将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 ) {

}

1 个答案:

答案 0 :(得分:4)

您可以使用std::vectorstd::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端使用哪种数据结构。