¿Cómo se crea una lista de vectores en RCPP?
Pregunta
Estoy escribiendo un RCPP recibir un módulo gustaría volver como un elemento de la lista RcppResultSet una lista cuyos elementos son vectores. Por ejemplo, .Call("myfunc")$foo
debe ser algo como:
[[1]]
[1] 1
[[2]]
[1] 1 1
[[3]]
[1] 1 1 1
(el número exacto no es importante aquí). La cuestión es que no sé la manera correcta de hacer esto RCPP. He intentado hacer pasar una vector<vector<int> >
pero esto construye una matriz mediante la adopción de silencio la longitud de la primera vector como el ancho (incluso si la matriz es desigual!). He intentado construir un RcppList
pero tienen dificultades para fundición varios objetos (como RcppVector
) con seguridad en SEXP
s.
Alguien tiene consejos sobre las mejores prácticas para tratar con estructuras complicadas tales como listas de vectores en RCPP?
Solución
[agradable ver esto aquí, pero Romain y yo generalmente recomiendan la lista RCCP-devel para la pregunta. Por favor, puesto que hay ahora en adelante ya que el proyecto no es sin embargo que los grandes lo justifica tengan preguntas dispersos por toda la web. ]
RcppResultSet
es parte de la mayor clásico API mientras que una gran cantidad de trabajo ha ido a lo que llamamos los nuevos API (empezando por el 0.7. * Comunicados). Echar un vistazo a la página RCPP en CRAN y la lista de viñetas - seis y contando.
Con la nueva API que volvería algo así como
return Rcpp::List::create(Rcpp::Named("vec") = someVector,
Rcpp::Named("lst") = someList,
Rcpp::Named("vec2") = someOtherVector);
todo en una declaración (y, posiblemente, el uso de las llamadas explícitas Rcpp::wrap()
), creando lo que en R sería
list(vec=someVector, lst=someList, vec2=someOtherVector)
Y Rcpp::List
también debe ser capaz de hacer listas de listas de listas ... aunque no estoy seguro de que tenemos pruebas unitarias para este --- pero hay numerosos ejemplos en los más de 500 pruebas de unidad.
Da la casualidad de que pasó los últimos días de la conversión de una gran cantidad de RQuantLib código de la API clásica a la nueva API. Esto probablemente ser liberado una vez que tengamos la versión 0.8.3 de RCPP a cabo (es de esperar en una Pocos diás). Mientras tanto, se puede ver en la RQuantLib SVN archivo
Otros consejos
I tendería a utilizar una variación comprimido de la solución de Dirk:
using namespace Rcpp ;
return List::create(
_["vec"] = someVector,
_["lst"] = someList,
_["vec2"] = someOtherVector
) ;
Además, para volver a la pregunta original, vector< vector<int> >
debe envolver en sí a una lista de vectores enteros, no una matriz. Ver:
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" )
Puedo obtener:
> fx()
[[1]]
[1] 0
[[2]]
[1] 0 0
[[3]]
[1] 0 0 0