2014-10-09 12 views
19

मैं लोकप्रिय data.table पैकेज पर आया हूं और विशेष रूप से मुझे एक चीज है। यह एक में जगह असाइनमेंट ऑपरेटर अगर आप data.table पैकेज लोड नहीं कियाक्यों है: = एक इंफिक्स ऑपरेटर के रूप में अनुमति दी?

:=

इस आधार आर वास्तव में में परिभाषित नहीं है, यह एक त्रुटि उठाया है | अगर आप इसे इस्तेमाल किया की कोशिश की थी है (उदाहरण के लिए , a := 2) संदेश के साथ:

Error: could not find function ":="

इसके अलावा, क्यों := काम करता है? क्यों आपको := को इंफिक्स ऑपरेटर के रूप में परिभाषित करने देता है जबकि प्रत्येक अन्य इंफिक्स फ़ंक्शन को %% से घिरा होना चाहिए, उदा।

`:=` <- function(a, b) { 
    paste(a,b) 
} 

"abc" := "def" 

जाहिर है यह इन्फ़िक्स कार्यों को परिभाषित करने के लिए %function.name% के लिए एक विकल्प वाक्य रचना होना नहीं है। data.table आर के कुछ पार्सिंग quirks का शोषण कर रहा है? क्या यह एक हैक है? क्या भविष्य में यह "पैच" होगा?

+5

कृपया पूछे जाने वाले प्रश्नों के साथ डेटाटेबल दस्तावेज पर नज़र डालें। –

+1

@DirkEddelbuettel। मैं समझता हूं कि इसका उपयोग डेटा.table में कैसे किया जाता है। लेकिन तथ्य यह है कि आर ऐसे ऑपरेटर को परिभाषित करने की अनुमति देता है और सिंटैक्स त्रुटि का कारण नहीं है जो मुझे चिंतित करता है। यह आर के बारे में एक मूलभूत सवाल है और शायद यह कोड को कैसे पार करता है। – xiaodai

+2

AFAIK यह डेटा.table के लिए स्थानीय है और केवल '[' सबसेटिंग के साथ काम करता है। तो आपका प्रश्न ऑफ-बेस (आर आर क्विर्क नहीं) है, इसलिए मैंने आपको डेटाटेबल डॉक्स पर भेजा है * जो इस पर चर्चा करता है *। –

उत्तर

29

यह ऐसा कुछ है जो आधार आर पार्सर पहचानता है और बाएं असाइन के रूप में पार्स लगता है (कम से कम संचालन के नियम या क्रम में)। अधिक जानकारी के लिए C source code देखें।

as.list(parse(text="a:=3")[[1]]) 
# [[1]] 
# `:=` 
# 
# [[2]] 
# a 
# 
# [[3]] 
# [1] 3 

जहां तक ​​मैं इसे अनियंत्रित कह सकता हूं (जहां तक ​​आधार आर का संबंध है)। ":" अपने आप में हिस्सा लेकिन यह एक समारोह/ऑपरेटर आप

`:=`<-function(a,b) {a+b} 
3 := 7 
# [1] 10 

के व्यवहार को बदल सकते हैं आप वहाँ देख सकते हैं वास्तव में कुछ के बारे में खास नहीं है। यह सिर्फ एक यौगिक टोकन की शुरुआत होती है।

+0

ई। ऐसा मत सोचो कि यह एक अच्छा विचार है। यह दस्तावेज है: '?': = '' 'Pkg: data.table लोड होने पर एक सहायता पृष्ठ लाता है। –

+12

@ बॉन्डडडस्ट लेकिन 'data.table' * उस * फ़ंक्शन का स्वामित्व नहीं है। वे वास्तव में पार्सर में चारों ओर झूठ बोलने वाले किसी चीज़ पर भरोसा कर रहे हैं जिस पर उनका कोई नियंत्रण नहीं है। एक और पैकेज 'सी' को फिर से परिभाषित कर सकता है अगर वे पसंद करते हैं। यह अनिवार्य रूप से वे क्या कर रहे हैं (वहां केवल ': = ') – MrFlick

+1

के लिए कोई डिफ़ॉल्ट कार्यान्वयन नहीं होता है ओपी ने डेटाटेबल पैकेज का उल्लेख किया है, इसलिए मैं तर्क दूंगा कि उस सेटिंग में' = '' डेटा के स्वामित्व में है। तालिका।मुझे लगता है कि अगर आप तर्क देते हैं कि अवधि-कार्य ('।()') में 'bquote' और plyr फ़ंक्शंस द्वारा अलग-अलग (स्थानीयकरण) "स्वामित्व" है, तो मैं आपके साथ सहमत हूं। और मेरे बिंदु पर, 'सी()' को फिर से परिभाषित करना भी एक बहुत बुरा विचार है। –

6

यह सिर्फ एक कोलन ऑपरेटर नहीं है बल्कि := कोलन और बराबर चिह्न ("<" के संयोजन के रूप में बनाया गया एक एकल ऑपरेटर है और बेस आर में असाइनमेंट ऑपरेटर बनाता है)। := ऑपरेटर एक इंफिक्स फ़ंक्शन है जिसे [.data.table फ़ंक्शन के अंदर "जे" तर्क के मूल्यांकन का हिस्सा माना जाता है। यह अपने आरएचएस का मूल्यांकन करने के परिणामस्वरूप अपने एलएचएस तर्क द्वारा नामित कॉलम के लिए मूल्य बनाता है या असाइन करता है।

+3

डाउनवॉटर जो अपनी चिंताओं को समझा नहीं रहे हैं। यह उत्तर मूल रूप से लिखे गए प्रश्न का जवाब देने के लिए लिखा गया था। आप "संपादित ...." लिंक पर क्लिक करके अपना मूल शीर्षक और सामग्री देख सकते हैं। –

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

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