Comment puis-je créer une liste de vecteurs dans CRPP?
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 SEXP
s.
Quelqu'un a des conseils sur les meilleures pratiques pour faire face à des structures complexes telles que les listes de vecteurs dans CRPP?
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