基本 Rcpp 列表输入错误

Error with Basic Rcpp List Input

我无法弄清楚是什么导致了以下代码中的错误。简而言之,代码尝试遍历列表元素(每个元素都是一个整数向量),并按顺序将它们分配给地图数据结构。

// [[Rcpp::export]]
void getPathsFromList(Rcpp::List& pathsList,
    std::unordered_map<int, std::vector<int> >& paths ){

  Rcpp::List plist(pathsList);
  int p=plist.size();
  for( int i=0;i<p; i++ ){
      SEXP e = plist[i];
      Rcpp::NumericVector v(e);
      for( int j=0; j<v.size(); j++ ){
          paths[i].push_back( v[j] );
      }
   }

 }

我得到的错误如下:

error: no matching constructor for initialization of 'std::__1::unordered_map<int, std::__1::vector<int, std::__1::allocator<int> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<const int, std::__1::vector<int, std::__1::allocator<int> > > > >

我还尝试将上面的 v[j] 显式分配给 int 变量,然后将其推入向量,但没有太大帮助。看来我缺少一些基本的东西,我将不胜感激任何帮助。 (我在 OSX 小牛队。)

不幸的是, Rcpp 不支持与 std:map<int, vector<int> > 一起工作。因此,无法形成"import"调用或将R对象带入C++。

如果你要删除 // [[Rcpp::export]] 并简单地通过 C++ 调用它,然后将 C++ 调用中的对象重新格式化为 Rcpp::List 出来,那么一切都会好起来的。

此外,您确实需要声明 C++11 标志,因为 unordered_map 是 C++11 特定的,通过:

// [[Rcpp::plugins(cpp11)]]

例如

#include <Rcpp.h>

// [[Rcpp::plugins(cpp11)]]

void getPathsFromList(Rcpp::List& pathsList,
    std::unordered_map<int, std::vector<int> >& paths ){

  Rcpp::List plist(pathsList);
  int p=plist.size();
  for( int i=0;i<p; i++ ){
      SEXP e = plist[i];
      Rcpp::NumericVector v(e);
      for( int j=0; j<v.size(); j++ ){
          paths[i].push_back( v[j] );
      }
   }

 }