2012-06-08 4 views
6

The manual कहता है:क्यों "=" आर ऑपरेटर का उपयोग कार्यों में नहीं किया जाना चाहिए?

ऑपरेटर '< -' कहीं भी इस्तेमाल किया जा सकता, ऑपरेटर जबकि '=' केवल शीर्ष स्तर पर अनुमति दी है (जैसे, कमांड प्रॉम्प्ट पर टाइप किया पूरा अभिव्यक्ति में ) या अभिव्यक्तियों की एक ब्रेस्ड सूची में उप-अभिव्यक्तियों के के रूप में।

The question here फ़ंक्शन कॉल में उपयोग किए जाने वाले अंतर का उल्लेख करते हैं। लेकिन समारोह परिभाषा है, यह सामान्य रूप से काम करने लगता है:

a = function() 
{ 
    b = 2 
    x <- 3 
    y <<- 4 
} 

a() 
# (b and x are undefined here) 

तो क्यों मैनुअल कहा गया है कि the operator ‘=’ is only allowed at the top level ??

language definition में इसके बारे में कुछ भी नहीं है (वहाँ सूचीबद्ध नहीं = ऑपरेटर, क्या शर्म की बात है!)

+0

इसका उल्लेख आर-लैंग में किया गया है [सेक्शन 10.4.2 इंफिक्स और उपसर्ग ऑपरेटरों] (http://cran.r-project.org/doc/manuals/R-lang.html#Infix-and-prefix-operators), लेकिन आपके द्वारा उल्लिखित सहायता प्रविष्टि में क्या है उससे कहीं अधिक नहीं कहता है। –

+5

आपके द्वारा उद्धृत पाठ "शीर्ष स्तर ** या ** उप-अभिव्यक्तियों की एक ब्रसेड सूची में" कहता है। आप इसे उप-अभिव्यक्तियों की एक ब्रसेड सूची में उपयोग कर रहे हैं। किसकी अनुमति है – Andrie

+5

आपको अभिव्यक्ति खोजने के लिए बहुत अधिक समय तक जाना है जो न तो अपरिवर्तनीय है और न ही ब्रेसिज़ के भीतर है। यहाँ एक है। आप कभी-कभी 'try' block के अंदर एक असाइनमेंट लपेटना चाहते हैं:' कोशिश करें (x <- f()) 'ठीक है, लेकिन' कोशिश करें (x = f (x)) 'नहीं है - आपको या तो बदलना होगा असाइनमेंट ऑपरेटर या ब्रेसिज़ जोड़ें। –

उत्तर

12

पाठ आप बोली at the top level OR in a braced list of subexpressions कहते हैं। आप इसे उप-अभिव्यक्तियों की एक ब्रसेड सूची में उपयोग कर रहे हैं। किसकी अनुमति है

आपको ऐसी अभिव्यक्ति खोजने के लिए बहुत अधिक समय तक जाना है जो न तो अपूर्ण है और न ही ब्रेसिज़ के भीतर है। यहाँ एक है। आप कभी-कभी कोशिश ब्लॉक के अंदर एक असाइनमेंट लपेटना चाहते हैं: try(x <- f()) ठीक है, लेकिन try(x = f(x)) नहीं है - आपको असाइनमेंट ऑपरेटर को बदलने या ब्रेसिज़ जोड़ने की आवश्यकता है।

+0

विन्सेंट, धन्यवाद, लेकिन यह जवाब कैसे है मेरे उदाहरण में 'बी = 2' गलत होने के बारे में मेरा सवाल है? शायद मुझे कुछ याद आती है तो कृपया अधिक स्पष्ट तरीके से समझाएं :) – TMS

+0

@ टोमास मैंने अपनी टिप्पणी जो आपको उपयोगी पाया।मुझे लगता है कि यह सवाल का जवाब देता है। – Andrie

+0

धन्यवाद एंड्री, बढ़िया! – TMS

7

भाव नहीं शीर्ष स्तर पर if तरह नियंत्रण संरचनाओं में उपयोग में शामिल हैं। उदाहरण के लिए, निम्न प्रोग्रामिंग त्रुटि अवैध है।

> if(x = 0) 1 else x 
Error: syntax error 

के रूप में यहाँ उल्लेख किया: https://stackoverflow.com/a/4831793/210673

भी देखें http://developer.r-project.org/equalAssign.html

+0

[दूसरे लिंक] (http://developer.r-project.org/equalAssign.html) के लिए धन्यवाद! सबसे महत्वपूर्ण जानकारी यह है: * "जहां इसकी अनुमति है,' = 'ऑपरेटर पहले के सभी असाइनमेंट (यानी '<-' और अन्य) के बराबर बराबर है।" * – TMS

3

system.time जैसे कुछ उदाहरणों के अलावा अन्य लोगों ने दिखाया है कि <- और = के अलग-अलग परिणाम हैं, मुख्य अंतर अधिक philisophical है। पर्ल के निर्माता लैरी वॉल ने कहा, "इसी तरह की चीजों को समान दिखना चाहिए, अलग-अलग चीजों को अलग दिखना चाहिए", मुझे यह देखने के लिए अलग-अलग भाषाओं में दिलचस्प लगता है कि चीजों को "समान" माना जाता है और जिन्हें " विभिन्न"। अब आर कार्य के लिए 2 आदेशों तुलना करते हैं:

myfun(a <- 1:10) 

myfun(a = 1:10) 

कुछ लोगों का तर्क था कि दोनों ही मामलों हम 1:10a को बताए रहे हैं ताकि हम क्या कर रहे हैं इसी तरह की है में।

अन्य तर्क यह है कि पहली कॉल में हम एक चर a ही वातावरण जहाँ से myfun बुलाया जा रहा है और दूसरी कॉल में हम एक चर a बनाया वातावरण में है कि करने के लिए बताए जाते हैं में है कि करने के लिए बताए जाते हैं जब फ़ंक्शन को कॉल किया जाता है और फ़ंक्शन के लिए स्थानीय होता है और उन दो a चर अलग होते हैं।

तो इसका उपयोग करने पर निर्भर करता है कि क्या आप "समान" या "अलग" असाइनमेंट पर विचार करते हैं या नहीं।

व्यक्तिगत रूप से, मैं <- पसंद करता हूं, लेकिन मुझे नहीं लगता कि यह एक पवित्र युद्ध से लड़ने लायक है।

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