2013-04-09 29 views
17

Burada neleri eksik?değerlendirme ve alıntı data.table

d = data.table(a = 1:5) 

d[, a]     # 1 2 3 4 5 
d[, sum(a)]    # 15 

d[, eval(quote(a))]  # 1 2 3 4 5 
d[, sum(eval(quote(a)))] # 15 

quoted_a = quote(a) 
d[, eval(quoted_a)]  # 1 2 3 4 5 
d[, sum(eval(quoted_a))] # Error in eval(expr, envir, enclos) : object 'a' not found 

Neler oluyor? R 2.15.0 ve data.table 1.8.9 çalıştırıyorum.

+0

Bugün böyle bir sorun yaşadım; ifade (sum (a)) 'yerine' quote (sum (a)) 'kullanılarak çözüldü. Neden önemli olduğuna dair bir fikrim yok. – rbatt

cevap

20

GÜNCELLEME (eddi): Bu giderildi ve .SD ifadesi OP gibi yerinde değerlendirilebilir durumlarda gerekli değildirversion 1.8.11 itibariyle. Şu anda .SD'un varlığı .SD'un tam olarak çalışmasını tetiklediğinden, bu durum bazı durumlarda çok daha hızlı hızlara neden olacaktır.


Neler oluyor olasılıkla [.data.table() uygulayan kodunda hayal daha eval() yapılan çağrılar farklı muamele olmasıdır. Özellikle, [.data.table(), eval sembolü ile başlayan i ve j ifadeleri için özel değerlendirme dalları içerir. Çağrıyı sum() aramasındaki eval'a ilettiğinizde, artık ayrıştırılmış/değiştirilen ifadenin ilk öğesi değildir ve özel değerlendirme dalı atlanır.

jsub = substitute(j) 
    ... 
    # Skipping some lines 
    ... 
jsubl = as.list.default(jsub) 
if (identical(jsubl[[1L]], quote(eval))) { # The test for eval 'on the outside' 
    jsub = eval(jsubl[[2L]], parent.frame(), parent.frame()) 
    if (is.expression(jsub)) 
     jsub = jsub[[1L]] 
} 

Çözüm olarak, ya izleyin: Burada

[.data.table() 'ın j -argument yoluyla geçirilen eval() aramalar için özel bir ödenek yapar getAnywhere("[.data.table") yazarak görüntülenen canavar işlev kodu biraz data.table SSS 1,6 ( pdf here) örneğinde veya 'u .SD yönüne doğru işaretleyin, burada çalıştığınız data.table sütunlarını bulunduran yerel değişken (burada d). ( .SD'un rolüyle ilgili daha fazla açıklama için, this answer'un ilk birkaç paragrafına bakın).

d[, sum(eval(quoted_a, envir=.SD))] 
+0

tamam, bunu nasıl düzeltebilirim? Hesaplamak için bir 'data.table' ve değişken ismini, örn. toplamı. Yukarıdaki kodu daha önce kullanmıştım (ve yemin edindiğim bir önceki versiyonda 'R' veya 'data.table' ile çalışmak için yemin edebilirim), ama bu sorunun dışında görünüyor ...? – eddi

+1

[** faq 1.6 **] 'da gösterildiği gibi 'quoted_a <- quote (sum (a))' hakkında bilgi (http://datatable.r-forge.r-project.org/datatable-faq.pdf) ? – Arun

+0

benim için işe yaramayacak, işlevi kim çağırıyorsa orada ne tür değerlendirmeler olacağını bilmiyorum orada – eddi