2013-04-09 7 views
17

मुझे यहां क्या याद आ रही है?डेटाटेबल में eval और quote

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 

क्या चल रहा है? मैं R 2.15.0 और data.table 1.8.9 चला रहा हूं।

+0

मुझे आज इस तरह की समस्या थी; 'अभिव्यक्ति (योग (ए)) के बजाय' उद्धरण (योग (ए)) 'का उपयोग करके हल किया गया था। कोई विचार नहीं कि यह क्यों mattered। – rbatt

उत्तर

20

अद्यतन (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))] 
+0

ठीक है, मैं इसे कैसे ठीक कर सकता हूं? मैं एक 'data.table' और एक चर नाम को एक फ़ंक्शन में पास करना चाहता हूं जो उदाहरण की गणना करेगा। 'योग '। मैं पहले उपरोक्त कोड का उपयोग कर रहा था (और मैं इसे 'आर' या 'data.table' के पिछले संस्करण के साथ काम करने के लिए इस्तेमाल कर सकता हूं), लेकिन ऐसा लगता है कि सवाल से बाहर है ...? – eddi

+1

कैसे के बारे में 'quoted_a <- उद्धरण (योग (क))' में दिखाया गया है [** फैक 1.6 **] (http://datatable.r-forge.r-project.org/datatable-faq.pdf) ? – Arun

+0

कि मेरे लिए काम नहीं करेगा, जो कोई भी समारोह बुला रहा है पता नहीं है मूल्यांकन किस तरह देखते – eddi