असाइनमेंट ऑपरेटरों =
और <-
आर के बीच अंतर क्या हैं ?
जैसा कि आपके उदाहरण से पता चलता है, =
और <-
थोड़ा अलग ऑपरेटर पूर्वता है (जो एक ही अभिव्यक्ति में मिश्रित होने पर मूल्यांकन के क्रम को निर्धारित करता है)। वास्तव में, ?Syntax
R में निम्न ऑपरेटर वरीयता तालिका देता है, उच्चतम से निम्नतम:
…
‘-> ->>’ rightwards assignment
‘<- <<-’ assignment (right to left)
‘=’ assignment (right to left)
…
लेकिन क्या यह एकमात्र अंतर है?
चूंकि आप असाइनमेंट ऑपरेटरों के बारे में पूछ रहे थे : हां, यह एकमात्र अंतर है। हालांकि, आपको अन्यथा विश्वास करने के लिए माफ कर दिया जाएगा। यहां तक ?assignOps
कि दावों के आर प्रलेखन कि अधिक अंतर हैं:
ऑपरेटर <-
का उपयोग कहीं भी किया जा सकता है, जबकि ऑपरेटर =
को केवल शीर्ष स्तर पर अनुमति दी जाती है (जैसे, कमांड प्रॉम्प्ट पर टाइप की गई पूर्ण अभिव्यक्ति में) या अभिव्यक्तियों की एक ब्रेडेड सूची में सबएक्सप्रेस में से एक के रूप में।
चलो इस पर एक बिंदु भी ठीक नहीं डालते हैं: आर प्रलेखन (सूक्ष्म रूप से) गलत है [ 1 ] । यह दिखाना आसान है: हमें बस =
ऑपरेटर के एक काउंटर-उदाहरण को खोजने की आवश्यकता है जो शीर्ष स्तर पर (ए) नहीं है, और न ही (बी) अभिव्यक्तियों की एक ब्रेडेड सूची (यानी {…; …}
) में एक उपप्रकार है । - बिना और देरी के:
x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1
स्पष्ट रूप से हमने =
प्रसंग (क) और (ख) के बाहर का उपयोग करते हुए एक असाइनमेंट किया है । तो, दशकों से एक कोर आर भाषा सुविधा का प्रलेखन गलत क्यों रहा है?
ऐसा इसलिए है क्योंकि R के सिंटैक्स में प्रतीक =
के दो अलग-अलग अर्थ हैं जो नियमित रूप से भ्रमित होते हैं:
- पहला अर्थ असाइनमेंट ऑपरेटर के रूप में है । यह सब हमने अब तक के बारे में बात की है।
- दूसरा अर्थ एक ऑपरेटर नहीं है, बल्कि एक सिंटैक्स टोकन है जो एक फ़ंक्शन कॉल में तर्क नाम के संकेतों को पारित करता है।
=
ऑपरेटर के विपरीत , यह रनटाइम पर कोई कार्रवाई नहीं करता है, यह केवल एक अभिव्यक्ति को पार्स करने के तरीके को बदलता है।
चलो देखते हैं।
सामान्य रूप के किसी भी कोड के…
‹function_name›(‹argname› = ‹value›, …)
‹function_name›(‹args›, ‹argname› = ‹value›, …)
... =
है यह: टोकन कि परिभाषित करता है नामित तर्क गुजर है नहीं असाइनमेंट ऑपरेटर। इसके अलावा, कुछ वाक्यात्मक संदर्भों में =
पूरी तरह से निषिद्ध है:
if (‹var› = ‹value›) …
while (‹var› = ‹value›) …
for (‹var› = ‹value› in ‹value2›) …
for (‹var1› in ‹var2› = ‹value›) …
इनमें से कोई भी एक त्रुटि "अप्रत्याशित '=' को bla>" बढ़ाएगा।
किसी अन्य संदर्भ में, =
असाइनमेंट ऑपरेटर कॉल को संदर्भित करता है। विशेष रूप से, केवल उपप्रकार के चारों ओर कोष्ठक लगाने से उपरोक्त (क) में से कोई भी वैध हो जाता है, और (ख) एक काम हो जाता है । उदाहरण के लिए, निम्नलिखित कार्य करता है:
median((x = 1 : 10))
लेकिन:
if (! (nf = length(from))) return()
अब आप इस बात पर आपत्ति कर सकते हैं कि ऐसा कोड अत्याचारपूर्ण है (और आप सही हो सकते हैं)। लेकिन मैंने इस कोड को base::file.copy
फ़ंक्शन से बदल दिया ( <-
साथ में)=
) - यह कोर आर कोडबेस में बहुत अधिक व्यापक पैटर्न है।
जॉन चैंबर्स द्वारा मूल स्पष्टीकरण , जो R प्रलेखन शायद पर आधारित है, वास्तव में सही ढंग इस बताते हैं:
[ =
असाइनमेंट है] व्याकरण में केवल दो स्थानों पर अनुमति है: शीर्ष स्तर पर (एक पूर्ण कार्यक्रम या उपयोगकर्ता-टाइप की गई अभिव्यक्ति के रूप में); और जब आसपास के तार्किक ढांचे से, ब्रेसिज़ या कोष्ठक की एक अतिरिक्त जोड़ी से अलग किया जाता है।
एक स्वीकारोक्ति: मैंने पहले झूठ बोला था। वहाँ है के बीच एक अतिरिक्त अंतर =
और <-
ऑपरेटरों: वे अलग कार्यों कहते हैं। डिफ़ॉल्ट रूप से ये फ़ंक्शन समान कार्य करते हैं लेकिन व्यवहार को बदलने के लिए आप दोनों को अलग-अलग ओवरराइड कर सकते हैं। इसके विपरीत, <-
और ->
(बाएं से दाएं असाइनमेंट), हालांकि वाक्यात्मक रूप से अलग, हमेशा एक ही फ़ंक्शन को कॉल करते हैं। एक को ओवरराइड करने से दूसरा ओवरराइड भी करता है। यह जानना शायद ही व्यावहारिक है लेकिन इसका उपयोग कुछ मजेदार शेंनिगों के लिए किया जा सकता है ।
<-
प्रतीक की उत्पत्ति पुराने एपीएल कीबोर्ड से होती है जो वास्तव में<-
उन पर एक ही कुंजी थी।