2010-07-16 15 views
26

"सबसे उपयोगी आर चाल क्या है?" (here), मैंने पढ़ा है कि वातावरण का उपयोग करके "पास-बाय-रेफरेंस क्षमताएं" दें। क्या इस दृष्टिकोण के साथ कोई सीमाएं और/या गठिया हैं?नए मामलों को बनाने के लिए किस मामले में new.env का उपयोग किया जाना चाहिए?

इसके अलावा, सामान्य रूप से बनाए गए वातावरण का उपयोग करने के पेशेवरों और विपक्ष क्या हैं? यह कुछ ऐसा है जो मुझे काफी समय से उलझन में डाल दिया गया है, इसलिए कोई स्पष्टता या संदर्भ मेरे लिए बहुत उपयोगी होगा।

अग्रिम धन्यवाद।

+0

यह gnarly हो सकता है और निश्चित रूप से "मानक" आर उपयोगकर्ता ('install.packages' + आयात डेटा + डेटा डेटा 'फ्रेम पर सांख्यिकीय परीक्षण चलाने के लिए आवश्यक है) के दायरे से परे है। लेकिन ग़लत कार्यों के लिए, मैं कभी-कभी 'new.env' के बारे में सोचता हूं जैसे पॉइंटर बनाना। अगर मैं एक सी 'स्ट्रक्चर' का अनुकरण करना चाहता था तो मैं इसे नेस्टेड 'new.env' के अनुक्रम के साथ करता हूं। – isomorphismes

+0

आप पर्यावरण के साथ [बहु-असाइन] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/list2env.html) भी कर सकते हैं। (एक माना जाता है कि फीचर जो कि पाइथोनिस्टस कभी-कभी शिकायत करती है।) – isomorphismes

उत्तर

28

जब मैं Harlan के समग्र सलाह से सहमत (यानी जब तक आप इसे समझते हैं कुछ का उपयोग नहीं करते), मैं जोड़ना होगा:

वातावरण आर में एक मौलिक अवधारणा रहे हैं, और मेरे विचार में, अत्यंत उपयोगी (दूसरे शब्दों में: वे समझने लायक हैं!)। दायरे से संबंधित मुद्दों को समझने के लिए वातावरण बहुत महत्वपूर्ण हैं। कुछ संदर्भ जो आपको इस संदर्भ में समझना चाहिए:

  1. search(): आपको कार्यक्षेत्र दिखाएगा; प्राथमिकता के क्रम में वातावरण सूचीबद्ध हैं। मुख्य पर्यावरण WebobalEnv है, और हमेशा इस तरह संदर्भित किया जा सकता है।
  2. ls(): तुम्हें दिखाता हूँ क्या एक वातावरण
  3. attach/detach में निहित है: एक वस्तु के लिए एक नया माहौल पैदा
  4. get, assign, <<-, और <-: आप इन कार्यों के बीच अंतर पता होना चाहिए
  5. with: इसे संलग्न किए बिना पर्यावरण के साथ काम करने के लिए एक विधि।

एक और सूचक: the proto package (ggplot में उपयोग किया गया) पर एक नज़र डालें, जो नियंत्रित विरासत प्रदान करने के लिए वातावरण का उपयोग करता है।

आखिरकार, मैं इंगित करता हूं कि वातावरण सूचियों के समान ही हैं: वे दोनों उनके भीतर किसी भी प्रकार की वस्तु को स्टोर कर सकते हैं (this question देखें)। लेकिन आपके उपयोग के मामले के आधार पर (उदा। क्या आप विरासत और प्राथमिकता से निपटना चाहते हैं), एक सूची के साथ काम करना आसान हो सकता है। और आप हमेशा पर्यावरण के रूप में एक सूची attach कर सकते हैं।

संपादित करें: आप ggplot में काम पर proto का एक उदाहरण देखना चाहते हैं, एक नजर है, तो है कि एक ggplot वस्तु की संरचना है, जो अनिवार्य वातावरण के आंशिक रूप से बना एक सूची है:

> p <- qplot(1:10, 1:10) 
> str(p) 
List of 8 
$ data  :'data.frame': 0 obs. of 0 variables 
$ layers  :List of 1 
    ..$ :proto object 
.. .. $ legend  : logi NA 
.. .. $ inherit.aes: logi TRUE 
... 
> class(p$layers[[1]]) 
[1] "proto"  "environment" 
> is.environment(p$layers[[1]]) 
[1] TRUE 

ध्यान दें कि यह प्रोटो का उपयोग करके कैसे बनाया गया है और परिणामस्वरूप कई वातावरण शामिल हैं। आप graph.proto का उपयोग करके इन वस्तुओं में संबंधों को भी प्लॉट कर सकते हैं।

+0

मैं उन्हें समझने की उम्मीद कर रहा हूं ताकि मैं उन्हें संभावित रूप से उपयोग कर सकूं। मैं आर में स्कॉइंग नियमों से कुछ हद तक परिचित हूं और आपके द्वारा सूचीबद्ध अधिकांश कार्यों के साथ, लेकिन मैं अधिक गहराई से विवरणों का पता लगाऊंगा। जानकारी के लिए धन्यवाद। – ramhiser

+3

पूरी तरह से सहमत हैं, शेन! यदि आप किसी भी महत्वपूर्ण मात्रा में कोड बना रहे हैं तो आर में पर्यावरण और स्कॉपिंग को समझना महत्वपूर्ण है! लेकिन यह जरूरी नहीं है कि आपको डेटा संरचनाओं के रूप में वातावरण का उपयोग करना चाहिए। – Harlan

+2

@ हरलन: मैं पूरी तरह से सहमत हूं। शायद मुझे उस मोर्चे पर अधिक बलवान होना चाहिए। @ जॉन: पर्यावरण का उपयोग न करें जब तक कि आप (1) उन्हें समझें और (2) ऐसा करने का एक अच्छा कारण है। एक सूची आम तौर पर एक बेहतर विकल्प है। आईएमओ, साइड इफेक्ट्स से बचने के लिए यह सबसे अच्छा अभ्यास है जबतक कि आप बिल्कुल नहीं कर सकते! – Shane

5

ठीक है, अगर आप उन्हें समझ में नहीं आते हैं, और जिन लोगों को आप किसी दिन अपने कोड (अपने भविष्य के स्वयं सहित) को पढ़ना चाहते हैं, तो पर्यावरण को समझ में नहीं आता है, तो आपको उनका उपयोग नहीं करना चाहिए! उन्हें पैकेजों में नाम रिक्त स्थान को समाहित करने के लिए उपयोग किए जाने के लिए डिज़ाइन किया गया था। तथ्य यह है कि आप पास-बाय-रेफरेंस के लिए उनका उपयोग कर सकते हैं और हैश टेबल का मतलब यह नहीं है कि होना चाहिए। यह एक चाल है। आम तौर पर, deep magic का उपयोग वास्तव में सलाह नहीं दिया जाता है, भले ही यह आपके कोड को थोड़ा तेज़ बनाता है।

+1

तो जब भी मैं एक नई चाल में आती हूं, तो मुझे इससे बचना चाहिए क्योंकि मुझे समझ में नहीं आ रहा है? अक्सर मैं समारोह से कार्य करने के लिए उन्हें पारित करके बड़ी कॉन्वर्सिस मैट्रिस पर संचालन करता हूं। वातावरण का उपयोग करके इस स्थिति में प्रदर्शन में सुधार करने के लिए पर्याप्त उपयोग करने के लिए पर्याप्त उपयोग करेंगे? – ramhiser

+0

मुझे कार्यान्वयन के विवरणों के बारे में पूरी तरह से यकीन नहीं है, लेकिन मेरा मानना ​​है कि यदि आप कार्यों के भीतर बड़े matrices को संशोधित नहीं करते हैं, तो वे वास्तव में कॉपी नहीं किए जाते हैं। आपके बड़े प्रश्न के अनुसार, मैं सलाह दूंगा कि यदि आपको गति की आवश्यकता है, तो यह जादूगर सीखने के लायक हो सकता है, बस ध्यान रखें कि यह ऐसा करने के लिए भाषा अर्थशास्त्र के एक (हल्के) दुरुपयोग है, और आप इसे पछतावा कर सकते हैं बाद में। या, आपको पछतावा नहीं हो सकता है! – Harlan

+4

+1 हारलन की चिंताओं को छूने के लिए: हाँ, यह एक खतरनाक उपयोग है क्योंकि यह "साइड इफेक्ट्स" पेश करता है। जब भी आप बाहरी दुनिया को बदलने के लिए किसी फ़ंक्शन को अनुमति देते हैं, तो आप अप्रत्याशित व्यवहार तक स्वयं को खोल रहे हैं। http://en.wikipedia.org/wiki/Side_effect_(computer_science) – Shane

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