2010-06-21 17 views
26

Sto scrivendo un modulo Rcpp e vorrei restituire come un elemento del RcppResultSet un elenco i cui elementi sono vettori. Per esempio, .Call("myfunc")$foo dovrebbe essere qualcosa di simile:Come posso creare un elenco di vettori in Rcpp?

[[1]] 
[1] 1 

[[2]] 
[1] 1 1 

[[3]] 
[1] 1 1 1 

(i numeri esatti non sono importanti qui). Il problema è che non conosco il giusto modo Rcpp di farlo. Ho provato a passare un vector<vector<int> > ma questo costruisce una matrice prendendo silenziosamente la lunghezza del primo vettore come larghezza (anche se la matrice è irregolare!). Ho provato a costruire un RcppList, ma ho difficoltà a lanciare vari oggetti (come RcppVector) in modo sicuro in SEXP s.

Chiunque ha suggerimenti sulle migliori pratiche per gestire strutture complicate come elenchi di vettori in Rcpp?

risposta

37

[Bello vedere questo qui ma Romain e io generalmente consigliamo l'elenco rccp-devel per la domanda. Si prega di postare in futuro poiché il progetto non è ancora così ampio che merita di avere domande sparse su tutto il web. ]

RcppResultSet fa parte della vecchia classico API, mentre un sacco di lavoro è andato in quello che noi chiamiamo il nuova API (a partire dalla 0.7. * Release). Dai un'occhiata all'attuale Rcpp page on CRAN e all'elenco delle vignette: sei e contando.

Con nuova API si sarebbe tornare qualcosa come

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

tutto in un unico prospetto (e possibilmente utilizzando espliciti Rcpp::wrap() chiamate), creando quello che in R sarebbe

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

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

Come è successo, ho passato gli ultimi giorni a convertire molto codice RQuantLib dalla classica API alla nuova API. Questo verrà probabilmente rilasciato una volta ottenuta la versione 0.8.3 di Rcpp (speriamo in pochi giorni). Nel frattempo, si può guardare al RQuantLib SVN archive

+0

Freddo, grazie! Tutto funziona se ti attieni alle nuove classi di 'Rcpp :: ...'! –

+0

Davvero freddo. Ho ancora bisogno di preparare nuove classi 'Rcpp :: Date' e' Rcpp :: Datetime' --- ma si può sicuramente vivere senza i vecchi 'RcppParams',' RcppResultSet', 'RcppVector', ... ecc. Feel libero di fornire nuovi test o esempi unitari o aggiunte ai documenti. Ci vediamo su 'rcpp-devel' quindi :) –

+0

Mi rendi la vita più facile. Anche se sono passati alcuni giorni da quando ho imparato Rcpp, ma non riesco a immaginare di tornare al combo di R & C. –

21

avrei tendono ad usare 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> > essa stessa avvolgere a un elenco di vettori interi, non una matrice. Vedere:

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

ottengo:

> fx() 

[[1]] 
[1] 0 

[[2]] 
[1] 0 0 

[[3]] 
[1] 0 0 0 
Problemi correlati