Frage

Ich bin ein RCPP Schreibmodul eine möchte als ein Element der RcppResultSet Liste zurückzukehren eine Liste, deren Elemente Vektoren. Z. B. .Call("myfunc")$foo sollte wie etwas sein:

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

(die genauen Zahlen sind hier nicht wichtig). Das Problem ist, dass ich weiß nicht, das Recht RCPP Weg, dies zu tun. Ich versuchte Übergabe eines vector<vector<int> > aber diese Konstrukte eine Matrix von geräuschlos die Länge des ersten Vektors als die Breite nehmen (auch wenn die Matrix zackig ist!). Ich habe versucht, eine RcppList konstruieren, sondern haben eine harte Zeit (wie RcppVector) verschiedene Objekte Gießen sicher in SEXPs.

Wer noch Tipps für Best Practices für die mit komplizierten Strukturen wie Listen von Vektoren in RCPP zu tun?

War es hilfreich?

Lösung

[Nizza das hier zu sehen, aber Romain und ich in der Regel den RCCP-devel Liste Frage. Bitte senden Sie es nach vorne gehen, da das Projekt noch nicht ist, dass großes es garantiert Fragen alle über das Internet verstreut zu haben. ]

RcppResultSet ist Teil der älteren klassische API, während eine Menge Arbeit gegangen in das, was wir nennen die neue API (beginnend mit dem 0.7. * Releases). Werfen Sie einen Blick auf den aktuellen RCPP Seite auf CRAN und die Liste der Vignetten - sechs und Zählen.

Mit der neuen API würden Sie so etwas wie zurückkehren

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

alle in einer Anweisung (und möglicherweise explizite Rcpp::wrap() Anrufe verwendet wird), zu schaffen, was in R würde

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

Und Rcpp::List sollte auch in der Lage sein, Listen von Listen von Listen zu tun ... obwohl ich nicht sicher bin, haben wir Unit-Tests für diesen --- aber es gibt zahlreiche Beispiele in den 500+ Unit-Tests.

Wie es passiert, habe ich in den letzten Tagen viel Umwandlung RQuantLib Code von der klassischen API auf die neue API. Dies wird wahrscheinlich frei bekommen, sobald wir Version erhalten 0.8.3 von RCPP aus (hoffentlich in einem ein paar Tage). In der Zwischenzeit können Sie sich im Blick RQuantLib SVN-Archiv

Andere Tipps

Ich würde dazu neigen, eine komprimierte Variante von Dirks Lösung zu verwenden:

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

Auch kommen zurück auf die ursprüngliche Frage, vector< vector<int> > sollte sich Vektoren auf eine Liste von Integer-wickeln, nicht eine Matrix. Siehe auch:

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

ich:

> fx() 

[[1]]
[1] 0

[[2]]
[1] 0 0

[[3]]
[1] 0 0 0
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top