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

Alguien tiene consejos sobre las mejores prácticas para tratar con estructuras complicadas tales como listas de vectores en RCPP?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top