2015-06-15 5 views
9

मैं आर वातावरण के बारे में पढ़ रहा है, और मैं एक साधारण उदाहरण के साथ मेरी समझ का परीक्षण करने के कोशिश कर रहा हूँ:कौन सा फ़ंक्शन आर वैरिएबल के संलग्न वातावरण के नाम की पहचान करेगा?

> f <- function() { 
+ x <- 1 
+ environment(x) 
+ } 
> 
> f() 
NULL 

मैं इसका मतलब है कि वस्तु एक्स शून्य नामित वातावरण से घिरा है यह सोचते हैं रहा हूँ, लेकिन जब मैं उस वातावरण में सभी वस्तुओं को सूचीबद्ध करने के लिए प्रयास करते हैं, आर एक त्रुटि संदेश प्रदर्शित करता है:

> ls(NULL) 
Error in as.environment(pos) : using 'as.environment(NULL)' is defunct 

तो मैं वहाँ अगर एक अंतर्निहित समारोह मैं कमांड लाइन पर उपयोग कर सकते हैं कि पर्यावरण वापस आ जाएगी सोच रहा हूँ ऑब्जेक्ट नाम दिया गया नाम। मैंने यह कोशिश की:

> environment(x) 
Error in environment(x) : object 'x' not found 

लेकिन इससे भी एक त्रुटि आई। किसी भी प्रकार की सहायता सराहनीय होगी।

+2

'x' नष्ट हो जाता है जब कार्य – jenesaisquoi

+2

निष्पादित किया जाता है 'पर्यावरण' फ़ंक्शन' फ़ंक्शन 'ऑब्जेक्ट का वातावरण देता है, न कि किसी मनमानी वस्तु में से एक। – nicola

+0

@nicola धन्यवाद- मुझे इसके बारे में पता नहीं था। – Robert

उत्तर

6

फ़ंक्शन कॉल में बनाए गए चर नष्ट हो जाते हैं जब फ़ंक्शन निष्पादित होता है (जब तक कि आप उन्हें विशेष रूप से अन्य लगातार वातावरण में नहीं बनाते)। जैसा कि @ जोरन ने बताया, जब एक समारोह कहा जाता है, एक अस्थायी वातावरण बनाया जाता है जहां स्थानीय चर परिभाषित किए जाते हैं, और जब कार्य निष्पादित किया जाता है तो नष्ट हो जाता है (वह स्मृति मुक्त हो जाती है)। हालांकि, जैसा कि @MrFlick ने इंगित किया है, यदि फ़ंक्शन एक फ़ंक्शन देता है, तो लौटा हुआ कार्य उस वातावरण के संदर्भ को बनाए रखता है जिसमें इसे बनाया गया था। आप 'scope', 'stack', and 'heap' के बारे में और अधिक पढ़ सकते हैं। आर में विभिन्न तरीकों से आप अपने चर को निर्दिष्ट वातावरण में परिभाषित कर सकते हैं।

f <- function() { 
    x <<- 1 # create x in the global environment (or change it if it's there) 
    ## or `assign` x to a value 
    ## assign(x, value=1, envir=.GlobalEnv) 
} 
environment(f) # where was f defined? 
exists("x", envir=.GlobalEnv) 
# [1] TRUE 
+2

शायद ऊपर दी गई आपकी टिप्पणी वाक्यांश का एक और तरीका यह कहना होगा कि 'f' निष्पादित करते समय, आर' f' के लिए एक वातावरण बनाता है जो फ़ंक्शन निष्पादन की अवधि के लिए रहता है। लेकिन एक बार 'एफ' किया जाता है, पर्यावरण (और इसमें जो कुछ भी है) खो जाता है। – joran

+1

@ जोरन वेल, फ़ंक्शन मौजूद होने के बाद फ़ंक्शन का वातावरण मौजूद हो सकता है यदि वह फ़ंक्शन कोई अन्य फ़ंक्शन या फॉर्मूला देता है। 'एफ <-फंक्शन (एक्स) {ए <-x + 1; फ़ंक्शन() ए}; पर्यावरण (च (5)) '। इस मामले में प्रत्येक बार फ़ंक्शन चलने पर एक नया वातावरण बनाया जाता है और फ़ंक्शन निकलने के साथ-साथ इसके अंदर परिवर्तनीय 'ए' के ​​बाद भी मौजूद रहता है। 'X <-f (5); एक्स() ' – MrFlick

+1

सूचनात्मक स्पष्टीकरण के लिए धन्यवाद। – Robert

6

पैकेज pryr इस तरह की चीजों को करने के लिए कुछ अच्छे काम करता है।

library(pryr) 
f <- function() { 
    x <- 1 
    where("x") 
} 
f() 
<environment: 0x0000000013356f50> 

तो x का वातावरण समारोह f() द्वारा बनाई गई अस्थायी वातावरण था: उदाहरण के लिए, वहाँ एक समारोह where कहा जाता है जो आपको एक वस्तु का वातावरण दे देंगे। जैसा कि लोगों ने पहले कहा है, इस समारोह को चलाने के बाद इस माहौल को नष्ट कर दिया गया है, इसलिए प्रत्येक बार जब आप f() चलाते हैं तो यह आपको एक अलग परिणाम देगा।

+0

धन्यवाद, कार्लोस- मैं इसे आज़मा दूंगा। – Robert

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