Spaltenauswahl mit einer Funktion in einer j-Umgebung

8

Betrachten Sie die folgende Spaltenauswahl in data.table :

%Vor%

Um meinen Code in bestimmten Berechnungen mit vielen und variablen Spalten zu rationalisieren, möchte ich list(a,b) durch eine Funktion ersetzen. Hier ist ein erster Versuch:

%Vor%

Idealerweise möchte ich eval() aus dem [.data.table -Aufruf entfernen und auf die Definition von .ab beschränken, während gleichzeitig vermieden werden soll, dass die Datentabelle dt an die Funktion .ab übergeben wird. .

%Vor%

Was passiert? Wie kann das behoben werden?

Ich vermute, was mich beißt, ist das lexikalische Scoping von R und die Tatsache, dass die korrekte Auswertung von list(a,b) darauf beruht, dass sie innerhalb der J Umgebung der Datentabelle dt liegt. Leider weiß ich nicht, wie man einen Verweis auf die richtige Umgebung holt und es als envir oder enclos Argument in dt verwendet.

%Vor%

BEARBEITEN

Dieser Ansatz fast funktioniert:

%Vor%

Es gibt zwei Nachteile: (1) Spaltennamen werden nicht zurückgegeben, (2) dt muss explizit übergeben werden (was ich lieber vermeiden möchte). Ich würde auch lieber vermeiden, dt als Auswahlumgebung zu codieren. Diese Überlegung führt zu einer alternativen Möglichkeit, die obige Frage zu stellen: Gibt es einen programmatischen Weg, um die Umgebung dt von .eab zu bekommen?

    
Ryogi 01.02.2013, 20:10
quelle

2 Antworten

2

Achtung, dies kann unrobust, langsam und / oder bruchanfällig sein, wenn sich die innere Maschinerie von [.data.table ändert, aber wenn aus irgendeinem Grund kein Weg da ist, ist hier eine Funktion, die Ihren Anforderungen entspricht. Ich könnte mir auch vorstellen, dass es nicht funktioniert, wenn Sie andere Optionen wie by in [.data.table verwenden.

%Vor%

Auch hier wird eine Menge Code, der aus einem guten Grund existiert, untergraben / reduziert.

    
user1935457 02.02.2013, 02:59
quelle
4

Es ist beabsichtigt, einen Ausdruck anstelle einer Funktion zu erstellen.

%Vor%

Dieser Ansatz ist ein Grund dafür, dass die Gruppierung in data.table schnell ist: j wird in einer statischen Umgebung für alle Gruppen ausgewertet, so dass der (kleine) Overhead jedes Funktionsaufrufs vermieden werden kann.

Aber wenn .ab aus irgendeinem Grund wirklich eine Funktion sein muss, dann können wir es sicherlich weiter überlegen.

    
Matt Dowle 01.02.2013 22:12
quelle

Tags und Links