2011-09-16 26 views
74

अगर कोई इसे सरल उदाहरण के साथ समझा सकता है तो यह सहायक होगा?आर में parent.frame() और parent.env() के बीच क्या अंतर है; संदर्भ में कॉल में वे अलग-अलग कैसे होते हैं?

इसके अलावा, parent.env() के बजाय parent.frame() का उपयोग करने के लिए उपयोगी होगा और इसके विपरीत।

उत्तर

88

parent.env वह वातावरण है जिसमें एक बंद (उदा।, फ़ंक्शन) परिभाषित किया गया है। parent.frame वह वातावरण है जहां से बंद किया गया था।

f = function() 
    c(f=environment(), defined_in=parent.env(environment()), 
     called_from=parent.frame()) 
g = function() 
    c(g=environment(), f()) 

और फिर

> g() 
$g 
<environment: 0x14060e8> 

$f 
<environment: 0x1405f28> 

$defined_in 
<environment: R_GlobalEnv> 

$called_from 
<environment: 0x14060e8> 

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

> f = function() x 
> g = function() { x = 2; f() } 
> h = function() { x = 3; function() x } 
> x = 1 
> f() 
[1] 1 
> g() 
[1] 1 
> h()() 
[1] 3 

को समझने में उपयोगी होते हैं या आर के परिचय में रहस्यमय 'बैंक खाता' उदाहरण में ?parent.frame के विवरण खंड का पहला अनुच्छेद चीजों को स्पष्ट कर सकता है।

वातावरण आर में व्यापक हैं, उदाहरण के लिए, search() पथ (लगभग) वातावरण एक भाई -> अभिभावक संबंध में एक साथ बंधे हैं। कभी-कभी env = new.env(parent=emptyenv()) को प्रतीक लुक-अप को रोकने के लिए देखता है - आम तौर पर env[["x"]]env में पहले दिखाई देगा, और फिर env के माता-पिता में नहीं मिलेगा। इसी तरह, <<-parent.env में असाइनमेंट की तलाश में है। आर में अपेक्षाकृत नया संदर्भ वर्ग कार्यान्वयन इन विचारों पर निर्भर करता है ताकि एक उदाहरण-विशिष्ट वातावरण को परिभाषित किया जा सके जिसमें प्रतीक (उदाहरण फ़ील्ड और विधियां) पाई जा सकें।