2016-07-28 3 views
-1

Je n'arrive pas à comprendre ce qui cause une erreur dans le code suivant. Brièvement, le code essaie de faire une boucle sur des éléments de liste (dont chacun est un vecteur d'entiers), et les affecte à une structure de données de carte dans l'ordre.Erreur avec l'entrée de la liste Rcpp de base

// [[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]); 
     } 
    } 

} 

L'erreur que je reçois est la suivante:

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> > > > > 

J'ai aussi essayé attribuer explicitement v[j] ci-dessus à une variable int puis en le poussant dans le vecteur, mais n'a pas tout à fait de l'aide. Il semble qu'il me manque quelque chose de fondamental et j'apprécierais grandement toute aide. (Je suis sur OSX Mavericks.)

+0

Veuillez ajouter quelques exemples de données avec lesquels vous prévoyez d'effectuer l'appel. – coatless

Répondre

1

Il n'y a malheureusement pas de soutien dans CRPP de travailler avec un std:map<int, vector<int> >. Ainsi, l'appel "import" ou l'apport d'objets R dans C++ est impossible à former.

Si vous deviez supprimer le // [[Rcpp::export]] et l'appelez simplement via C++, puis reformatez l'objet dans l'appel C++ à Rcpp::List, alors tout ira bien.

En outre, vous ne devez déclarer le drapeau 11 C++ depuis unordered_map est C++ 11 spécifique via:

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

par exemple

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

} 
+0

Merci beaucoup! – mskb