2011-08-11 14 views
38

डेटाटेबल ने: = ऑपरेटर पेश किया है। < ओवरलोड क्यों नहीं करें?डेटा.table परिभाषित क्यों किया गया है: = ओवरलोडिंग के बजाय <-?

+0

मुझे लगता है कि दो: श्रद्धांजलि में पास्कल के लिए !!! – Iterator

+0

मुझे लगता है! हम किसी भी ऑपरेटर का चयन नहीं कर सके, यह केवल (सौभाग्य से) आर अनुमति देता है: = परिभाषित किया जाना चाहिए। अन्यथा हम मज़ेदार और परिभाषित कर सकते हैं + =, - =, ~ = आदि :) –

+1

क्या कोई व्यक्ति कृपया "ओवरलोडिंग <-" का अर्थ बता सकता है? – Michael

उत्तर

14

मुझे नहीं लगता कि यह आवश्यक होना चाहिए, निम्नलिखित कारणों से: := केवल [...] के अंदर उपयोग किया जाता है, इसलिए इसे हमेशा उद्धृत किया जाता है। [...] अभिव्यक्ति वृक्ष के माध्यम से यह देखने के लिए जाता है कि := इसमें है या नहीं।

इसका मतलब है कि यह वास्तव में ऑपरेटर के रूप में कार्य नहीं कर रहा है और यह वास्तव में अधिभारित नहीं है; इसलिए वे अपने इच्छित ऑपरेटर को बहुत ज्यादा चुन सकते थे। मुझे लगता है कि यह बेहतर लग रहा था? या कम भ्रमित क्योंकि यह स्पष्ट रूप से <- नहीं है?

(ध्यान दें कि यदि :=[...] की बाहर इस्तेमाल किया गया यह <- नहीं किया जा सका, क्योंकि आप वास्तव में <- नहीं ओवरलोड कर सकते हैं। <- अपनी बाईं तर्क का मूल्यांकन नहीं करता है तो यह पता नहीं है कि किस प्रकार है) ।

+6

हां, यह बहुत अधिक है। हमने कोशिश की <- वास्तव में पहले लेकिन वह उड़ नहीं गया क्योंकि उपयोगकर्ता कोड पहले ही इस्तेमाल किया गया है <- j में उदा। एक समूह काउंटर में वृद्धि। फिर हमने कोशिश की << - लेकिन लोग पहले से ही j में भी इसका उपयोग करते हैं, ताकि WebobalEnv को असाइन किया जा सके। तो फिर हम पर मारा: =। –

25

दो स्थानों है कि <- सकता है 'अतिभारित' जा रहे हैं:

x[i, j] <- value   # 1 
x[i, {colname <- value}] # 2 

पहले एक प्रतियां x के पूरे *tmp* को, बदल जाता है कि काम कर प्रतिलिपि, और x वापस करने के लिए प्रदान करती है। यह एक आर चीज है (src/main/eval.c और subassign.c) हाल ही में आर-डेवेल here पर चर्चा की गई। ऐसा लगता है कि *tmp* पर उस प्रतिलिपि से बचने के लिए, पैकेज को या आर स्वयं को अनुमति देने के लिए आर को बदलना संभव हो सकता है, लेकिन वर्तमान में यह संभव नहीं है, IIUC।

दूसरा, ओवेन का जवाब क्या है, मुझे लगता है। यदि आप स्वीकार करते हैं कि j के भीतर संदर्भ द्वारा असाइनमेंट करना ठीक है, तो कौन सा ऑपरेटर? ओवेन के जवाब पर टिप्पणी के अनुसार, <- और <<- पहले से ही j में उपयोगकर्ताओं द्वारा उपयोग किए जाते हैं, इसलिए हम := पर हिट करते हैं।

भी [<- अगर x की पूरी नकल नहीं था, हम अभी भी चाहते j में := तो हम इस तरह कर सकते हैं:

DT[,{newcol1:=sum(a) 
    newcol2:=a/newcol1}, by=group] 

कहाँ नए कॉलम तालिका के संदर्भ द्वारा जोड़ रहे हैं, और प्रत्येक समूह के प्रत्येक := का आरएचएस मूल्यांकन किया जाता है। (जब:। समूह के भीतर = कार्यान्वित किया जाता है)


अद्यतन अक्टू 2012

के रूप में 1.8.2 (क्रैन पर जुला 2012 में), :=समूह से जोड़ने या अद्यतन करने के लिए लागू किया गया था एकल कॉलम; यानी, := का एकल एलएचएस। और अब v1.8.3 में (लिखने के समय आर-फोर्ज पर), समूह द्वारा कई कॉलम जोड़े जा सकते हैं; जैसे,

DT[, c("newcol1","newcol2") := .(sum(a),sum(b)), by=group] 

या, शायद अधिक सुंदर ढंग से:

DT[,`:=`(newcol1=sum(a), 
     newcol2=sum(b)), by=group] 

लेकिन पुनरावृत्ति कई आरएचएस, थोड़ी देर है, जहां 2 अभिव्यक्ति पहले से परिणाम के लिए इस्तेमाल कर सकते हैं की परिकल्पना की गई, लागू नहीं है अभी तक (FR#1492)। तो यह अभी भी एक त्रुटि "newcol1 not found" देने के लिए और दो चरणों में किया जा करने की आवश्यकता होगी:

DT[,`:=`(newcol1=sum(a), 
     newcol2=a/newcol1), by=group] 
+3

बस एक मामूली बात, 'x [i, j] <- value' वास्तव में' <-' 'को अधिभारित नहीं कर रहा है, बल्कि' <-' जो करता है वह हमेशा करता है '[<-' (अभिव्यक्ति के आधार पर) , मूल्य प्रकार नहीं)। – Owen

+0

@ ओवेन आह हाँ, अच्छा बिंदु। 'अधिभारित' के आसपास उद्धरण और उद्धरण जोड़ा है। –

संबंधित मुद्दे