Domanda

sto scrivendo un modulo Rcpp una vorrebbe tornare come un elemento della lista RcppResultSet una lista i cui elementi sono vettori. Per esempio, .Call("myfunc")$foo dovrebbe essere qualcosa di simile:

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

(i numeri esatti non sono importanti qui). Il problema è che io non conosco la strada Rcpp giusto di fare questo. Ho provato passando un vector<vector<int> > ma questo costruisce una matrice prendendo silenziosamente la lunghezza del primo vettore come la larghezza (anche se la matrice è affannoso!). Ho provato la costruzione di un RcppList, ma hanno difficoltà a getto vari oggetti (come RcppVector) in modo sicuro in SEXPs.

Qualcuno ha suggerimenti sulle migliori prassi per trattare con strutture complesse, come gli elenchi dei vettori in Rcpp?

È stato utile?

Soluzione

[bello vedere questo qui, ma Romain e vi consiglio generale il lista RCCP-devel per la domanda. Si prega di inviare lì andando avanti in quanto il progetto non è ancora quella grande che garantisce di avere domande sparse in tutto il web. ]

RcppResultSet fa parte del più vecchio classica API, mentre un sacco di lavoro è andato in quello che noi chiamiamo nuovi API (a partire dalla 0.7. * Release). Date un'occhiata alla Rcpp su CRAN e l'elenco delle vignette - sei e conteggio.

Con la nuova API che ci si restituire qualcosa del genere

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

tutto in un unico prospetto (ed eventualmente utilizzando chiamate Rcpp::wrap() esplicite), creando quello che in R sarebbe

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

E Rcpp::List dovrebbe anche essere in grado di fare le liste di liste di liste ... anche se non sono sicuro che abbiamo test di unità per questo --- ma ci sono numerosi esempi nei test di unità 500+.

Si dà il caso, ho trascorso gli ultimi giorni la conversione di un sacco di RQuantLib codice dal classico API per la nuova API. Questo sarà probabilmente ottenere rilasciato una volta che otteniamo la versione 0.8.3 di Rcpp fuori (si spera in un pochi giorni). Nel frattempo, si può guardare al RQuantLib SVN archivio

Altri suggerimenti

I tenderebbe a utilizzare una variante compressa della soluzione di Dirk:

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

Inoltre, per tornare alla domanda iniziale, vector< vector<int> > dovrebbe sé avvolgere a un elenco di vettori interi, non è una matrice. Vedi:

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" ) 

I ottenere:

> fx() 

[[1]]
[1] 0

[[2]]
[1] 0 0

[[3]]
[1] 0 0 0
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top