2011-12-26 9 views
10

मैंने parent.env() के लिए प्रलेखन पढ़ा है और यह काफी सरल लगता है - यह संलग्न वातावरण देता है। हालांकि, अगर मैं enclosing वातावरण की श्रृंखला चलने के लिए parent.env() का उपयोग करता हूं, तो मुझे ऐसा कुछ दिखाई देता है जिसे मैं समझा नहीं सकता। सबसे पहले, कोड ("संक्षेप में आर" से लिया)parent.env (x) भ्रम

library(PerformanceAnalytics) 
x = environment(chart.RelativePerformance) 
while (environmentName(x) != environmentName(emptyenv())) 
{ 
    print(environmentName(parent.env(x))) 
    x <- parent.env(x) 
} 

और परिणाम:

[1] "imports:PerformanceAnalytics" 
[1] "base" 
[1] "R_GlobalEnv" 
[1] "package:PerformanceAnalytics" 
[1] "package:xts" 
[1] "package:zoo" 
[1] "tools:rstudio" 
[1] "package:stats" 
[1] "package:graphics" 
[1] "package:utils" 
[1] "package:datasets" 
[1] "package:grDevices" 
[1] "package:roxygen2" 
[1] "package:digest" 
[1] "package:methods" 
[1] "Autoloads" 
[1] "base" 
[1] "R_EmptyEnv" 

हम कैसे शीर्ष पर "आधार" और पर "आधार" की व्याख्या कर सकते तल? साथ ही, हम "पैकेज: प्रदर्शन विश्लेषिकी" और "आयात: प्रदर्शन विश्लेषिकी" कैसे समझा सकते हैं? सब कुछ पहली दो लाइनों के बिना संगत दिखाई देगा। यही है, फ़ंक्शन चार्ट। रिलेवेटिव पैराफॉर्मेंस पैकेज में है: PerformanceAnalytics वातावरण जो xts द्वारा बनाया गया है, जो चिड़ियाघर द्वारा बनाया गया है ... ... आधार और खाली वातावरण के लिए सभी तरह ऊपर (या नीचे)।

इसके अलावा, दस्तावेज इस पर बहुत स्पष्ट नहीं है - क्या पर्यावरण "पर्यावरण" है जिसमें एक और वातावरण बनाया गया है और इस प्रकार parent.env() चल रहा है "सृजन" श्रृंखला दिखाता है?

संपादित

बेशर्म प्लग: मैं एक blog post कि सहज ज्ञान युक्त चित्र के साथ वातावरण, parent.env(), बाड़ों, नाम स्थान/पैकेज, आदि बताते लिखा था।

+0

सभी ने इस सवाल पर योगदान करने के लिए धन्यवाद। जवाब चुनना मुश्किल था क्योंकि सभी पोस्ट – SFun28

उत्तर

3

आपके परिणामों में पहले कुछ आइटम नियमों के सबूत देते हैं आर नामों के साथ संकुल में फ़ंक्शंस में उपयोग किए जाने वाले चर की खोज के लिए उपयोग करता है। R-ext manual से:

नामस्थान पैकेज में कार्यों द्वारा उपयोग किए जाने वाले चर के लिए खोज रणनीति को नियंत्रित करता है। यदि स्थानीय रूप से नहीं मिला है, तो पहले पैकेज नामस्थान खोजता है, फिर आयात, फिर आधार नामस्थान और फिर सामान्य खोज पथ।

बस थोड़ा विस्तार से चर्चा करते chart.RelativePerformance की पहली कुछ पंक्तियों पर एक नजर है:

head(body(chart.RelativePerformance), 5) 
# { 
#  Ra = checkData(Ra) 
#  Rb = checkData(Rb) 
#  columns.a = ncol(Ra) 
#  columns.b = ncol(Rb) 
# } 

जब chart.RelativePerformance के लिए एक कॉल मूल्यांकन किया जा रहा है, उन प्रतीकों में से प्रत्येक --- कि क्या लाइन पर checkData 1, या ncol लाइन 3 पर --- खोज पथ पर कहीं और पाया जाना चाहिए। यहाँ पहले कुछ संलग्न वातावरण जाँच कर रहे हैं:

  • सबसे पहले namespace:PerformanceAnalytics है। checkData वहां पाया गया है, लेकिन ncol नहीं है।

  • अगला स्टॉप (और आपके परिणामों में सूचीबद्ध पहला स्थान) imports:PerformanceAnalytics है। यह पैकेज की NAMESPACE फ़ाइल में आयात के रूप में निर्दिष्ट कार्यों की सूची है। ncol या तो यहां नहीं मिला है।

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

+0

जोश थे - लेकिन मैं parent.env() को कॉल कर रहा हूं जो कि संलग्न वातावरण है। क्या मैं गलत समझ रहा हूं कि parent.env() क्या करना चाहिए? उपरोक्त श्रृंखला के मुताबिक, गोबल पर्यावरण एक "पैरेंट" या "संलग्न" आधार है और लाइन बेस नीचे "ऑटोलोड" संलग्न करता है, इसलिए प्रभाव आधार आधार पर संलग्न होता है! तो क्या हम कह रहे हैं कि parent.env() वास्तव में वैश्विक वातावरण तक पहुंचने तक संलग्न वातावरण नहीं है? – SFun28

+0

@ SFun28 मेरा (अपूर्ण) समझ यह है कि "अभिभावक-बच्चा" env के लिए एक भ्रामक रूपक हो सकता है। एक संलग्न एनवी एक संकेतक है जहां आर सख्त रोकथाम संबंधों के बगल में दिखता है। तो आप शायद एनवी के सभी प्रकार की गैर-सहज श्रृंखलाओं का निर्माण कर सकते हैं जो लूप वापस खुद पर हैं। – joran

+0

ओह - मुझे लगता है कि मैं आपकी चिंता देखता हूं। जैसा कि जी ग्रोथेंडिक और कोब्स्की ने जोर दिया, इस खोज तंत्र को संभव बनाने के लिए खोज की गई पहली 'आधार' को 'नेमस्पेस: बेस' कहा जाता है। इसकी सामग्री 'पैकेज: बेस' के समान होती है, जैसा कि' समान (एलएस (बेसेंव()), एलएस (.BaseNamespaceEnv)) ' –

3

दूसरा base.BaseNamespaceEnv है, जबकि दूसरा base अंतिम baseenv() है। ये अलग नहीं हैं (शायद w.r.t. इसके माता-पिता)। .BaseNamespaceEnv का माता-पिता .GlobalEnv है, जबकि baseenv()emptyenv() है।

पैकेज में, जैसा कि @ जोश कहते हैं, आर पैकेज के नामस्थान, फिर आयात, और फिर आधार (यानी, BaseNamespaceEnv) की खोज करता है।

आप इस से, उदा, environmentName समारोह की अपनी गलती पा सकते हैं, .:

> library(zoo) 

> packageDescription("zoo") 
Package: zoo 

# ... snip ... 

Imports: stats, utils, graphics, grDevices, lattice (>= 0.18-1) 

# ... snip ... 

> x <- environment(zoo) 

> x 
<environment: namespace:zoo> 

> ls(x) # objects in zoo 
    [1] "-.yearmon"    "-.yearqtr"    "[.yearmon"    
    [4] "[.yearqtr"    "[.zoo"     "[<-.zoo"     
# ... snip ... 

> y <- parent.env(x) 
> y # namespace of imported packages 
<environment: 0x116e37468> 
attr(,"name") 
[1] "imports:zoo" 

> ls(y) # objects in the imported packages 

    [1] "?"          "abline"        
    [3] "acf"         "acf2AR"        
# ... snip ... 
+0

कोहस्के द्वारा तोड़ा जा सकता है - आह! मुझे एहसास नहीं हुआ कि ये दो अलग-अलग वातावरण हैं। तो वास्तव में हर मुद्रित वातावरण एक अद्वितीय वातावरण है? मैं "नेमस्पेस", "आयात", और "पैकेज" वातावरण के बीच एक भ्रम देखना शुरू कर रहा हूं। दिखाया गया नहीं है कि पहले एक्स का वातावरण "नेमस्पेस: प्रदर्शन विश्लेषिकी" है।क्या आप इन वातावरणों के बीच मतभेदों को स्पष्ट कर सकते हैं, जब वे लोड होते हैं, और वे एक-दूसरे से कैसे संबंधित होते हैं? – SFun28

+0

आपके उत्तर पर विस्तार के लिए धन्यवाद, इससे बहुत मदद मिली! – SFun28

5

1) के बारे में कैसे base वहाँ दो बार हो सकता है (यह देखते हुए कि वातावरण एक पेड़ के रूप में),। असल में पहली घटना .BaseNamespaceEnv है और बाद की घटना baseenv() है।

> identical(baseenv(), .BaseNamespaceEnv) 
[1] FALSE 

2) imports:PerformanceAnalytics कि एक विशेष वातावरण है कि आर आयात पैकेज के NAMESPACE या वर्णन फ़ाइल में उल्लेख किया है धारण करने के लिए इतना है कि यह में वस्तुओं और कुछ भी करने से पहले का सामना करना पड़ा रहे सेट करता है के बारे में।

कुछ स्पष्टता के लिए इसे चलाने का प्रयास करें। str(p) और if बयान निम्नलिखित क्या p है का एक बेहतर विचार दे देंगे:

library(PerformanceAnalytics) 
x <- environment(chart.RelativePerformance) 
str(x) 
while (environmentName(x) != environmentName(emptyenv())) { 
    p <- parent.env(x) 
    cat("------------------------------\n") 
    str(p) 
    if (identical(p, .BaseNamespaceEnv)) cat("Same as .BaseNamespaceEnv\n") 
    if (identical(p, baseenv())) cat("Same as baseenv()\n") 
    x <- p 
} 
+0

यह शानदार है! इस कोड के साथ parent.env संबंध देखना बहुत आसान है। मैं उत्सुक हूं, पैकेज में आयात करने का क्या फायदा है? मैंने अपना खुद का पैकेज बनाया है लेकिन आयात का उपयोग नहीं करते हैं। यह बस प्रतीकों को अधिक तेज़ी से ढूंढने या बेस में एक ही प्रतीक की तुलना में प्रतीक को उच्च प्राथमिकता देने के लिए है? – SFun28

+0

'आयात' का उपयोग करके, आप उपयोगकर्ताओं को अदृश्य आयात पैकेज में ऑब्जेक्ट्स बना सकते हैं। यदि आपका पैकेज एक आयात बी है, तो आप अपने पैकेज से बी की ऑब्जेक्ट्स का उपयोग कर सकते हैं। लेकिन उपयोगकर्ता ए – kohske

+0

को लोड करने के बाद भी बी की ऑब्जेक्ट्स का उपयोग नहीं कर सकते हैं, यह एक महान उपयोगिता/सहायक कार्य है (यानी खोज कोड (x) नामक फ़ंक्शन में अपना कोड लपेटना)। ऐसा लगता है कि आर एक खोज() और searchpaths() फ़ंक्शन प्रदान करता है, लेकिन हमें globalenv – SFun28