2011-11-02 25 views
6

मैं यह कैसे सुनिश्चित कर सकता हूं कि जब किसी फ़ंक्शन को कॉल किया जाता है तो उसे वैश्विक वातावरण से चर पकड़ने की अनुमति नहीं है?फ़ंक्शन को अलग करने के लिए कैसे करें

मुझे निम्नलिखित कोड मुझे एक त्रुटि देना चाहते हैं। इसका कारण यह है कि मैंने गलत टाइप किया हो सकता है (मैं y टाइप करना चाहता था)।

z <- 10 
temp <- function(x,y) { 
     y <- y + 2 
     return(x+z) 
} 
> temp(2,1) 
[1] 12 

मुझे लगता है कि उत्तर वातावरण के साथ करना है, लेकिन मुझे अभी तक उनको समझ में नहीं आया है।

क्या मेरे वांछित व्यवहार को डिफ़ॉल्ट बनाने के लिए कोई तरीका है (उदाहरण के लिए कोई विकल्प सेट करके)?

+1

प्रोटोटा होम पेज पर 27 फरवरी, 2010 समाचार वस्तु में कुछ चर्चा है: http://r-proto.googlecode.com। –

+0

@ जी Grothendieck धन्यवाद, यह दिलचस्प लग रहा है। मुझे यकीन नहीं है कि मैं इस तरह के एक बड़े पैकेज/दर्शन के परिवर्तन में खोदने की तरह महसूस करता हूं। लेकिन एक बार मुझे और अनुभव मिलने पर मैं इसे ध्यान में रखूंगा। –

+0

मुझे पूरा यकीन है कि यह पहले से ही यहां पूछा जा चुका है। – hadley

उत्तर

4
> library(codetools) 
> checkUsage(temp) 
<anonymous>: no visible binding for global variable 'z' 

फ़ंक्शन नहीं बदलता है, इसलिए इसे हर बार उपयोग करने की आवश्यकता नहीं है। findGlobals अधिक सामान्य है, और थोड़ा और गूढ़ है। जैसे

Filter(Negate(is.null), eapply(.GlobalEnv, function(elt) { 
    if (is.function(elt)) 
     findGlobals(elt) 
})) 

कुछ माहौल में सभी कार्यों का दौरा कर सकते हैं, लेकिन अगर वहाँ कई कार्य हैं तो शायद यह समय एक पैकेज लेखन (यह है कि मुश्किल नहीं है) के बारे में सोचना है।

+0

धन्यवाद! यह एक महान समारोह की तरह दिखता है। हालांकि, आपको अभी भी दिखाई देने वाले वातावरण के बारे में चिंता करने की ज़रूरत है। यानी, अगर मैं अपने मूल पोस्ट में सभी कोड कॉपी और सम्मिलित करता हूं और फिर 'checkUsage (temp)' चलाता हूं तो यह किसी त्रुटि की रिपोर्ट नहीं करेगा। मुझे केवल 'temp' फ़ंक्शन कॉपी करने की आवश्यकता है। –

+0

पैकेज के लिए 'findGlobals' और सहायता पृष्ठ देखें। –

+0

ठीक है, मैं इसे देख लूंगा। मैं ls() में सभी कार्यों पर checkUsage कैसे चला सकता हूं? या यदि यह मुश्किल है, मान लीजिए कि ls() द्वारा केवल आउटपुट आउटपुट हैं, तो मैं उन सभी पर चेकयूज़ कैसे चला सकता हूं? मैंने 'lapply (ls(), FUN = checkUsage) की कोशिश की लेकिन यह काम नहीं करता है। –

5
environment(temp) = baseenv() 

भी http://cran.r-project.org/doc/manuals/R-lang.html#Scope-of-variables और ?environment देखें।

+0

यह आधार वातावरण में चर के अलावा सभी को मुखौटा करेगा। यानी, ऐड-ऑन पैकेज 'temp' के भीतर उपलब्ध नहीं हैं। – kohske

+0

और मैं 'बेस' को छोड़कर सबकुछ कैसे मास्क करूंगा और कहूं, 'प्लीयर' पैकेज? –

+0

सुनिश्चित नहीं है लेकिन शायद 'पर्यावरण (अस्थायी) <- new.env (parent = as.environment (search() [2]))' केवल वैश्विक वातावरण को मुखौटा करेगा। – kohske

1
environment(fun) = parent.env(environment(fun)) 

इस खोज पथ से "कार्यस्थान" पर्यावरण (.GlobalEnv) को हटा दें और सब कुछ छोड़ देंगे (मैं अपने कार्य नाम स्पष्टता के लिए 'temp' के स्थान पर 'फन' का उपयोग कर रहा) अन्य (उदाहरण के लिए सभी पैकेज)।

+0

धन्यवाद! अगली बार जब मैं आता हूं तो मैं इसे आजमाउंगा। –

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

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