2010-06-21 27 views
26

Estoy escribiendo un módulo Rcpp y me gustaría devolver como un elemento de la lista RcppResultSet una lista cuyos elementos son vectores. Por ejemplo, .Call("myfunc")$foo debería ser algo como:¿Cómo creo una lista de vectores en Rcpp?

[[1]] 
[1] 1 

[[2]] 
[1] 1 1 

[[3]] 
[1] 1 1 1 

(las cifras exactas no son importantes aquí). El problema es que no conozco la forma correcta de hacerlo. Intenté pasar un vector<vector<int> > pero esto construye una matriz tomando silenciosamente la longitud del primer vector como el ancho (¡incluso si la matriz está irregular!). Intenté construir un RcppList, pero tuve dificultades para transmitir varios objetos (como RcppVector) de forma segura en SEXP s.

¿Alguien tiene consejos sobre las mejores prácticas para manejar estructuras complicadas como listas de vectores en Rcpp?

Respuesta

37

[Es bueno ver esto aquí pero Romain y yo generalmente recomendamos la lista rccp-devel para la pregunta. Por favor, publique allí en el futuro ya que el proyecto aún no es tan grande como para tener preguntas diseminadas 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 la nueva API (empezando por el 0.7. * Comunicados). Eche un vistazo a la actual Rcpp page on CRAN y la lista de viñetas: seis y contando.

con nueva API que volvería algo así como

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

todos en un estado de cuenta (y posiblemente usando explícitas Rcpp::wrap() llamadas), creando lo que en R sería

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

y Rcpp::List También debería haber capaz de hacer listas de listas ... aunque no estoy seguro de que tengamos pruebas unitarias para esto --- pero hay numerosos ejemplos en las pruebas de 500+ unidades.

Sucede que pasé los últimos días convirtiendo una gran cantidad de código RQuantLib de la API clásica a la nueva API. Esto probablemente se publique una vez que obtengamos la versión 0.8.3 de Rcpp (con suerte en unos pocos días). Mientras tanto, se puede ver en la RQuantLib SVN archive

+0

fresca, gracias! ¡Todo funciona si te apegas a las nuevas clases 'Rcpp :: ...'! –

+0

Cool de hecho. Todavía necesito cocinar nuevas clases 'Rcpp :: Date' y' Rcpp :: Datetime' --- pero definitivamente puedes vivir sin los viejos 'RcppParams',' RcppResultSet', 'RcppVector', ... etc. Feel libre de contribuir nuevas pruebas unitarias o ejemplos, o adiciones a los documentos. Nos vemos en 'rcpp-devel' luego :) –

+0

Me hace la vida más fácil. Aunque han pasado unos días desde que aprendí Rcpp pero no puedo imaginar volver al combo de R & C –

21

Me tienden a utilizar una variación comprimido de la solución de Dirk:

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

También, para volver a la pregunta original, vector< vector<int> > debe envolverse en 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") 

me sale:

> fx() 

[[1]] 
[1] 0 

[[2]] 
[1] 0 0 

[[3]] 
[1] 0 0 0 
Cuestiones relacionadas