2011-12-26 15 views
7

पर्यावरण में किसी नाम को मान निर्दिष्ट करने और चर के वातावरण को सेट करने के बीच क्या अंतर है? मैं इसे दस्तावेज़ीकरण से नहीं समझ सका।असाइनमेंट के बीच अंतर (..., envir = ...) और पर्यावरण (...) =

उदाहरण के लिए

:

MyTestFunc = function(x) 
{ 
    myVal = "abcde" 

    # what is this doing? why is myVal not in the global environment after 
    # this call? I see it adds an environment attribute to the variable, 
    # but what good is that? 
    environment(myVal) = globalenv() 

    assign("myVal" , myVal , envir = globalenv()) 

    # this seems to copy graphics:::rect to the current environment which seems 
    # to contradict the behavior of environment(myVal) above 
    environment(rect) = environment() 

    # this seems to do the same thing 
    assign("rect" , rect , envir = globalenv()) 
} 

# this prints out rect, but shows <environment: namespace: graphics>! 
rect 

उत्तर

6

असाइन समारोह बस निर्दिष्ट वातावरण में एक मूल्य के लिए एक नाम बांधता

?।। लेकिन पर्यावरण प्रतिस्थापन समारोह दो चीजें करता है: इसका मुख्य उद्देश्य फ़ंक्शन क्लोजर के वातावरण को बदलना है। वह वातावरण वह है जहां फ़ंक्शन का बॉडी कोड वैश्विक चर और कार्यों की तलाश करता है। आम तौर पर, यह वातावरण वह कार्य होता है जहां फ़ंक्शन परिभाषित किया गया था (इसलिए यदि आप इसे प्रॉम्प्ट पर परिभाषित करते हैं तो यह ग्लोबलेंव का उपयोग करेगा)। "बोनस" के रूप में, यह केवल अन्य ऑब्जेक्ट प्रकारों के लिए पर्यावरण गुण प्रदान करता है। यह अधिकांश ऑब्जेक्ट्स के लिए बहुत बेकार है, लेकिन सूत्रों द्वारा उपयोग किया जाता है।

दूसरी बात यह है कि यह किसी भी अन्य प्रतिस्थापन समारोह की तरह काम करता है: यदि वर्तमान वातावरण में नाम मौजूद है तो यह इसे सीधे संशोधित करता है, अन्यथा यह स्थानीय प्रतिलिपि बनाता है और इसे संशोधित करता है। तो आपके मामले में, यह रेक्ट फ़ंक्शन की स्थानीय प्रति बनाता है और इसके पर्यावरण को बदलता है। मूल कार्य अपरिवर्तित बनी हुई है।

# showing names replacement behavior 
f <- function() { 
    names(letters) <- LETTERS 
    letters # the local modified copy 
} 
f() # prints changed letters 
letters # unchanged 
+0

सुपर स्पष्ट उत्तर के लिए धन्यवाद! – SFun28

1

एक समारोह के अंदर आप से पूछा और मार डाला:

# what is this doing? why is myVal not in the global environment after this call? 
    # I see it adds an environment attribute to the variable, but what good is that? 
    environment(myVal) = globalenv() 

तो तुम सच है कि समारोह में किया गया था "abcde" नाम myVal वस्तु के लिए कुछ भी नहीं किया । इसके बजाय आपने फ़ंक्शन के पर्यावरण के अंदर "abcede" नाम का एक नया वातावरण बनाया है। फिर आप को मार डाला:

assign("myVal" , myVal , envir = globalenv()) 

यह "abcde" के चरित्र मोड मूल्य स्थानीय समारोह पर्यावरण से इकट्ठा के साथ "myVal" नामक एक चर बनाया है, और यह वैश्विक वातावरण में डाल दिया। अब इसमें "पर्यावरण" नामक एक विशेषता है। हालांकि, यह स्पष्ट नहीं है कि आपके लक्ष्य क्या हैं, क्योंकि पर्यावरण को फ़ंक्शन के दायरे को परिभाषित करने के लिए उपयोग करने के लिए डिज़ाइन किया गया है। किसी डेटा ऑब्जेक्ट को पर्यावरण असाइन करना सिर्फ अजीब है। वेरिएबल्स वातावरण में हैं, लेकिन परिवर्तनीय के वातावरण को स्थापित करने में उपयोगी उद्देश्य प्रतीत नहीं होता है। इसलिए मैं आपके सवाल का जवाब लगता है: ... क्या अच्छा है कि "होना चाहिए" यह किसी भी अच्छा नहीं है "

+0

मैं पर्यावरण (myVal) = globalenv() के बारे में आपकी टिप्पणियों को दोहराने के लिए प्रतीत नहीं कर सकता। अगर मैंने "abcde" नामक वातावरण बनाया है तो वह वातावरण कहां है? मैं इसे कैसे एक्सेस करूं? ऐसा लगता है कि मैंने अभी myVal में एक पर्यावरण गुण जोड़ा है। और पर्यावरण (आयताकार) = पर्यावरण() क्या बताता है? मेरे लक्ष्य पर्यावरण को बेहतर ढंग से समझने के लिए हैं ताकि मैं अधिक उन्नत परिदृश्यों का पता लगा सकूं। – SFun28

+0

आपने किसी चरित्र ऑब्जेक्ट में एक पर्यावरण विशेषता जोड़ा है। यदि आप MyTestFunc() पर कॉल निष्पादित करने के बाद कंसोल में "abcde" टाइप करते हैं, तो आपको आउटपुट मिलता है जिसमें निम्न शामिल हैं: 'attr (, "पर्यावरण") <पर्यावरण: R_GlobalEnv> '। मुझे नहीं पता कि कोई उस माहौल का उपयोग कैसे करेगा। मुझे लगता है कि यह परिवर्णी शब्द डीडीटी के तहत आता है। –

+0

आह, समझ गया! मैंने अपना कोड नमूना थोड़ा सा अपडेट किया है। क्या आप एक नज़र देख सकते हैं। क्या असाइन() और पर्यावरण() रेक्ट के लिए कॉल करता है वही काम करता है? और रेक्ट प्रिंटआउट ग्लोबलेंव की तुलना में एक अलग वातावरण क्यों दिखाता है? – SFun28

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