Rcpp: Structura de cod recomandată atunci când se utilizează cadre de date cu Rcpp (inline)

[Am avut această schiță ca un comentariu în altă parte, dar a decis să creeze o întrebare corectă ...]

What is currently considered "best practice" in terms of code structuring when using data frames in Rcpp? The ease with which one can "beam over" an input data frame from R to the C++ code is remarkable, but if the data frame has n columns, is the current thinking that this data should be split up into n separate (C++) vectors before being used?

Răspunsul la întrebarea mea anterioară privind utilizarea unei coloane (vector de caractere) într-un cadru de date sugerează că da, acesta este cel mai bun lucru de făcut. În special, nu pare să fie suport pentru o notație, cum ar fi df.name [i] , pentru a se referi direct la informațiile despre cadrele de date (cum ar fi într-o structură C) Mă înșel.

However, this leads us into a situation where subsetting down the data is much more cumbersome - instead of being able to subset a data frame in one line, each variable must be dealt with separately. So, is the thinking that subsetting in Rcpp is best done implicitly, via boolean vectors, say?

Pentru a rezuma, cred că pe scurt aș vrea să îmi dau seama de înțelegerea mea actuală că, deși un cadru de date poate fi transmis spre codul C ++, nu există nicio modalitate de a se referi direct la elementele individuale ale coloanelor sale într-un "df.name [ i] modă și nici o metodă simplă de generare a unui cadru sub-date al inputului df prin selectarea rândurilor care să îndeplinească criterii simple (de exemplu, df.date fiind într-un anumit interval).

0
Exact. Folosesc Rcpp :: DataFrame. Dar nu pare să existe o modalitate de a face referire la datele elementelor fără a redefini mai întâi coloanele ca vectori separați (dacă nu mă înșel)
adăugat autor Tim P, sursa
Nu într-adevăr ceea ce întrebi, dar, ca la o parte, poate data.table codul sursă din C oferă câteva indicii despre o modalitate de a manipula data.frame la nivelul C. Nu știu dacă este similară în C ++.
adăugat autor Matt Dowle, sursa
@Hansi, nu este și asta este ceea ce Tim folosește.
adăugat autor Dirk Eddelbuettel, sursa
Destul de sigur că Rcpp are un Rcpp :: DataFrame
adăugat autor Hansi, sursa

1 răspunsuri

Because data frames are in fact internally represented as list of vectors, the access by vectors really is the best you can do. There simply is no way to subset by row at the C or C++ level.

A fost o discuție bună despre asta pe r-devel în urmă cu câteva săptămâni în contextul transpunerii unei cadre de date (pe care nu o puteți face "ieftin" din același motiv).

0
adăugat
Mulțumesc lui Dirk - deși nu a putut găsi discuția pe care ați menționat-o? Am dreptate să mă gândesc atunci că vectorii booleeni sunt cel mai bun mod de a lua în considerare diferite subseturi ale cadrului de date în cadrul codului C ++?
adăugat autor Tim P, sursa
În beneficiul altora, iată firul lui Dirk: link ), pentru a asigurați-vă că valorile dintr-un rând sunt întotdeauna "legate împreună". În Rcpp, designul este ortogonal la acest lucru (li
adăugat autor Tim P, sursa
De acord, deși este cazul, pare ciudat că nu există nicio notație de a scoate cel de-al treilea element (de exemplu) din coloana "vârstă" într-un obiect cadru de date Rcpp prin denumirea vectorului și apoi a elementului. Înțeleg că DF ["age"] dă vectorul coloanei (așa cum o putem atribui unei alte variabile, age ), dar nu există o modalitate de a trage df $ age [3] ca, nu știu, (DF ["age"]) [2] în Rcpp?
adăugat autor Tim P, sursa
După cum am aflat de Rcpp acum câteva zile și cu ochii mei glazurați la codul complex C ++ (sunt în primul rând un coder R), sunt destul de sigur că nu sunt persoana potrivită pentru a scrie patch-ul necesar. Mi-e teamă că va trebui să-mi părăsesc contribuția, subliniind nevoia ...!
adăugat autor Tim P, sursa
Re-discuția r-devel: căutați un fir cu Antonio Piccolboni și Simon Urbanek. În ceea ce privește indexarea booleană, nu sunt sigur dacă am implementat vreodată acest lucru. Dacă aveți îndoieli, faceți-o "manual" prin pozițiile indexului, deoarece astfel vectorii C ++ funcționează nativ.
adăugat autor Dirk Eddelbuettel, sursa
Structurile de date R se întâmplă să fie vectori și liste. Chiar și o matrice este doar un vector de dimensiune 'n ori k' cu atribute de dimensiune 'n, k'.
adăugat autor Dirk Eddelbuettel, sursa
Ei bine, dacă tu ai nevoie de notația asta atât de rău, ce zici dacă tu ai contribuția la implementarea patch-urilor?
adăugat autor Dirk Eddelbuettel, sursa