2014-02-09 5 views
11

Ich möchte ein data.table mit einer Variablen der Teilmenge, die den gleichen Namen wie die Spalte, die leeds einiger Probleme hat:Subsetting data.table Variablen mit demselben Namen wie Spalte

dt <- data.table(a=sample(c('a', 'b', 'c'), 20, replace=TRUE), 
       b=sample(c('a', 'b', 'c'), 20, replace=TRUE), 
       c=sample(20), key=c('a', 'b')) 

evn <- environment() 
a <- 'b' 
dt[a == a] 

#Expected Result 
dt[a == 'b'] 

ich über this possible solution kam:

env <- environment() 
dt[a == get('a',env)] 

Aber es ist so unhandlich wie:

this.a = a 
dt[a == this.a] 

so gibt es eine andere elegante Lösung?

+3

Wir kennen diese [Scoping-Ausgabe] (https://r-forge.r-project.org/tracker/index.php?func= Detail & Hilfe = 2110 & group_id = 240 & atid = 978). Dies ist sehr wichtig und wird so schnell wie möglich behoben werden. Danke für die Berichterstattung. Für den Moment wäre die Verwendung eines anderen Variablennamens der richtige Weg. – Arun

+0

Ich bin verwirrt - warum würden Sie denken, dass "a == a" funktionieren sollte oder eine gute Syntax ist? R-forge scheint für mich atm down zu sein, also kann ich den Link von @Arun nicht sehen und worum es genau geht, aber die Arbeit von 'a == a' (so wie OP es will) scheint wie eine schlechte Idee für mich und ich denke deine letzte Lösung * ist * die richtige. – eddi

+1

Getrennt von meinem obigen Kommentar können Sie 'dt [a]' – eddi

Antwort

4

Vorerst könnte eine vorübergehende Lösung sein,

`..` <- function (..., .env = globalenv()) 
{ 
    get(deparse(substitute(...)), env = .env) 
} 

..(a) 
## [1] "b" 

dt[a==..(a)] 
## a b c 
## 1: b a 15 
## 2: b a 11 
## 3: b b 8 
## 4: b b 4 
## 5: b c 5 
## 6: b c 12 

Obwohl diese elegant aussieht, warte ich immer noch auf eine robustere Lösung für solche Probleme Umfang.

Herausgegeben nach @ MNEL Vorschlag,

`..` <- function (..., .env = sys.parent(2)) 
{ 
    get(deparse(substitute(...)), env = .env) 
} 
+1

'env = sys.parent (2)' könnte sicherer sein. – mnel

+0

@ mnel Ein nettes Anliegen! Darf ich fragen "Warum" und wo kann ich die zugehörige Dokumentation zum Lesen finden? –

+0

Sie rufen möglicherweise '.data.table' von etwas, das nicht die globale Umgebung ist,' sys.parent (2) ', sucht und findet die richtige Aufrufumgebung. – mnel