2017-11-19 11 views
14

मुझे पता है कि वैरिएबल नामकरण करते समय वैश्विक नामस्थान से नामों का उपयोग न करना अच्छा अभ्यास है, लेकिन जब आप इसे गलती से करते हैं तो क्या होता है?आर को फ़ंक्शन का उपयोग करने के बारे में कैसे पता चलता है, यदि उस फ़ंक्शन का नाम किसी मान पर फिर से सौंप दिया गया है?

मैंने सोचा कि मैं पिछले वस्तु खो देगा लेकिन आर हुड के नीचे कुछ प्रवंचना है लगता है:

print(sd) 
#> function (x, na.rm = FALSE) 
#> sqrt(var(if (is.vector(x) || is.factor(x)) x else as.double(x), 
#>  na.rm = na.rm)) 
#> <bytecode: 0x0000000017e687b8> 
#> <environment: namespace:stats> 

sd <- 12.2 

print(sd) 
#> [1] 12.2 

sd(1:10) 
#> [1] 3.02765 

तो अब आर जानता दोनों लंबाई एक डबल वेक्टर sd कहा जाता है और एक आँकड़े समारोह है वैश्विक नामस्थान में sd()?

या जब मैं sd(1:10) पर कॉल करता हूं तो दुभाषिया स्वचालित रूप से इसे sd.default() पर फैलाता है? लेकिन आर sd पर एक डिफ़ॉल्ट विधि को देखने के लिए कैसे जानता है क्योंकि यह अब एक वेक्टर है? तो स्मृति में विभिन्न स्थानों में संग्रहीत कार्यों और चर को उसी नाम से संदर्भित किया जा सकता है?

obviously_a_user_defined_variable <- 257 
obviously_a_user_defined_variable(1:10) 
#> Error in obviously_a_user_defined_variable(1:10): could not find 
# function "obviously_a_user_defined_variable" 
+0

सरल उत्तर: 'sd (1:10)' फ़ंक्शन 'sd' पर कॉल है। तो आर 'sd()' नामक फ़ंक्शन की तलाश करता है, जिसे इसे प्री-लोड किए गए आंकड़े पैकेज में मिलता है। –

+0

आप जिस शब्द (और टैग) का उपयोग करना चाहते हैं वह ** 'shadowing' ** है, जैसा कि 'उसी नाम के चर' फ़ंक्शन को छाया दे रहा है '। कड़ाई से, फ़ंक्शन का नाम 'पुनः असाइन नहीं किया गया' है। – smci

उत्तर

13

आर separate namespaces for functions and variables है। उस संदर्भ के आधार पर जिसमें कोई नाम होता है, आर नाम को एक नामस्थान में या दूसरे में देखेगा।

उदाहरण के लिए, अभिव्यक्ति sd(1:10) एक कॉल है और कॉल में पहला तत्व किसी फ़ंक्शन का नाम होना चाहिए। इसलिए, इस मामले में, आर sd नामक फ़ंक्शन की तलाश करेगा।

दूसरी ओर, अभिव्यक्ति sd एक कॉल नहीं है लेकिन एक नाम है, जो या तो एक चर या किसी नाम का नाम हो सकता है। इस मामले में आर sd नामक खोज पथ में पहली वस्तु के लिए पहली बार देखेंगे चाहे यह एक फ़ंक्शन या किसी अन्य प्रकार का ऑब्जेक्ट हो।

+0

अच्छा संदर्भ, मुझे लगता है कि मैं Lisp-1 परिदृश्य पसंद करता हूं, जहां एक नाम केवल एक चीज़ और एक चीज़ को इंगित करता है। उस तरह से कम अस्पष्टता। लेकिन शायद आर के दृष्टिकोण – hrabel

+0

आर के लिए लाभ बहुत लचीला हैं। आप पूरी तरह से काम कर सकते हैं यहां तक ​​कि पूरी तरह से भयानक चाल भी कर सकते हैं। यह इसकी ताकत और इसकी कमजोरी है। मैं आपके साथ एक डेवलपर के रूप में सहमत हूं लेकिन व्यावहारिक होने के लिए तथ्य यह है कि आर हमेशा जो भी लिखता है वह आपके काम को उपयोगी और सुविधाजनक बनाता है। – JRR

+3

इसका अंतिम भाग बिल्कुल सही नहीं है; बिना ब्रांड्स के, आर 'एसडी' नामक खोज पथ में पहली चीज़ की तलाश करता है, भले ही यह किसी ऑब्जेक्ट का फ़ंक्शन है, उदा।'mtcars <- function() 'foo'; mtcars' – alistaire

4

sdglobalenv में नहीं stats वातावरण में अंतर्गत आता है। कॉलिंग sd() आर फ़ंक्शन sd पर दिखता है। यह globalenv में नहीं है इसलिए जब तक यह एक समारोह sd

यह शाब्दिक scoping कहा जाता है और यह हैडली की किताबें http://adv-r.had.co.nz/ से समझाया गया है पाता है यह अन्य वातावरण में लग रहा है। इस अध्याय में http://adv-r.had.co.nz/Environments.html या यह एक http://adv-r.had.co.nz/Functions.html

+1

'खोज()' पथ बताता है कि यह कहां पाता है (और यह 'sd()' से पहले 'sd' क्यों पाता है), लेकिन यह क्यों नहीं 'sd()' की तलाश में रहता है, जो संभवतया है क्योंकि कोष्ठक इसका मतलब है किसी ऑब्जेक्ट की बजाय फ़ंक्शन कॉल के रूप में व्याख्या की जाती है। – alistaire

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

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