अद्यतन (Eddi):version 1.8.11 के रूप में यह तय किया गया है और .SD
मामलों में जहां अभिव्यक्ति जगह में मूल्यांकन किया जा सकता, ओपी में की तरह में जरूरत नहीं है। चूंकि वर्तमान में .SD
की उपस्थिति पूरे .SD
के निर्माण को ट्रिगर करती है, इसके परिणामस्वरूप कुछ मामलों में बहुत तेजी से गति हो जाएगी।
क्या हो रहा है कि eval()
के लिए कॉल अलग माना जाता है की तुलना में आप की संभावना कोड कि [.data.table()
लागू करता है में कल्पना है। विशेष रूप से, [.data.table()
i
और j
भाव है कि प्रतीक eval
के साथ शुरू करने के लिए विशेष मूल्यांकन शाखाओं में शामिल है। जब आप sum()
के लिए एक कॉल के अंदर eval
करने के लिए कॉल लपेट, eval
नहीं रह गया है पार्स/प्रतिस्थापित अभिव्यक्ति का पहला तत्व है, और विशेष मूल्यांकन शाखा को छोड़ दिया है।
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]]
}
समाधान के लिए, या तो का पालन करें:
यहाँ राक्षस समारोह में कोड का सा getAnywhere("[.data.table")
कि [.data.table()
के j
-argument के माध्यम से में पारित eval()
पर कॉल के लिए एक विशेष भत्ता बनाता लिखकर देखा है data.table पूछे जाने वाले प्रश्न 1.6 (pdf here), या स्पष्ट रूप में उदाहरण इंगित .SD
की ओर eval()
, स्थानीय चर कि जो कुछ भी data.table आप पर (यहाँ d
) काम कर रहे हैं के स्तंभों रखती है। (.SD
की भूमिका के कुछ और स्पष्टीकरण के लिए, this answer के पहले कुछ पैराग्राफ देखें)।
d[, sum(eval(quoted_a, envir=.SD))]
स्रोत
2013-04-09 22:53:59
मुझे आज इस तरह की समस्या थी; 'अभिव्यक्ति (योग (ए)) के बजाय' उद्धरण (योग (ए)) 'का उपयोग करके हल किया गया था। कोई विचार नहीं कि यह क्यों mattered। – rbatt