Question

J'écris un module CRPP un voudrais revenir comme un élément de la liste RcppResultSet une liste dont les éléments sont des vecteurs. Par exemple, .Call("myfunc")$foo devrait être quelque chose comme:

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

(les chiffres exacts ne sont pas importants ici). Le problème est que je ne sais pas la bonne façon de le faire CRPP. J'ai essayé de passer un vector<vector<int> > mais construit une matrice en prenant en silence la longueur du premier vecteur que la largeur (même si la matrice est saccadée!). Je l'ai essayé la construction d'un RcppList mais ont du mal à jeter divers objets (comme RcppVector) en toute sécurité dans SEXPs.

Quelqu'un a des conseils sur les meilleures pratiques pour faire face à des structures complexes telles que les listes de vecteurs dans CRPP?

Était-ce utile?

La solution

[agréable de voir ça ici, mais Romain et je recommande généralement liste de RCCP-devel pour la question. S'il vous plaît poster là aller de l'avant que le projet n'est pas encore que grand, il garantit d'avoir des questions éparpillées sur tout le web. ]

RcppResultSet fait partie des plus anciens classique API alors beaucoup de travail est entré dans ce que nous appelons les nouveaux API (en commençant par 0,7. * Versions). Jetez un oeil à la page CRPP sur et CRAN la liste des vignettes - six compte.

Avec la nouvelle API vous reviendriez quelque chose comme

return Rcpp::List::create(Rcpp::Named("vec") = someVector,
                          Rcpp::Named("lst") = someList,
                          Rcpp::Named("vec2") = someOtherVector);

tous dans une instruction (et éventuellement à l'aide des appels explicites Rcpp::wrap()), créant ainsi ce que R serait

list(vec=someVector, lst=someList, vec2=someOtherVector)

Et Rcpp::List devrait également être en mesure de faire des listes de listes de listes ... mais je ne suis pas sûr que nous avons des tests unitaires pour ce --- mais il existe de nombreux exemples dans les tests unitaires 500+.

Comme il arrive, j'ai passé les derniers jours convertir beaucoup de code rquantlib de l'API classique à la nouvelle API. Ce sera probablement publié une fois que nous obtenir la version 0.8.3 de obtenir CRPP sur (je l'espère dans un quelques jours). En attendant, vous pouvez consulter le rquantlib SVN archives

Autres conseils

je aurais tendance à utiliser une variante compressée de la solution de Dirk:

using namespace Rcpp ;
return List::create( 
   _["vec"]  = someVector, 
   _["lst"]  = someList, 
   _["vec2"] = someOtherVector
 ) ;

En outre, de revenir à la question initiale, vector< vector<int> > devrait s'envelopper à une liste de vecteurs entiers, et non une matrice. Voir:

require( Rcpp )
require( inline )
require( RUnit )

fx <- cxxfunction( , '

    std::vector< std::vector<int> > v ;

    std::vector<int> x1(1) ; v.push_back( x1 );
    std::vector<int> x2(2) ; v.push_back( x2 );
    std::vector<int> x3(3) ; v.push_back( x3 );

    return wrap( v ) ;

', plugin = "Rcpp" ) 

J'obtenir:

> fx() 

[[1]]
[1] 0

[[2]]
[1] 0 0

[[3]]
[1] 0 0 0
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top