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