2010-07-18 11 views
10

मैं एक समारोह लिखने की कोशिश कर रहा हूं, जो आर चर के दायरे को सीमित करता है। उदाहरण के लिए,सीमित चरम सीमा

source("LimitScope.R") 
y = 0 
f = function(){ 
    #Raises an error as y is a global variable 
    x = y 
} 

मैं चर पर्यावरण परीक्षण के बारे में सोचा, लेकिन वास्तव में ऐसा करने के तरीके के बारे में सुनिश्चित नहीं था।

क्यों

मैं undergrads के लिए आर सिखाना। अपने पहले कुछ व्यावहारिक में उनमें से कुछ हमेशा परिवर्तनीय दायरे के बारे में भूल जाते हैं, इसलिए उनके सबमिट किए गए कार्य काम नहीं करते हैं।

n = 10 
f = function(x){ 
    #Raises an error 
    #as I just source f and test it for a few test cases. 
    return(x*n) 
} 

मैं एक त्वरित समारोह है कि 'बंद कर देते हैं' होगा गुंजाइश के बाद किया गया था: उदाहरण के लिए, मैं हमेशा की तरह कुछ मिलता है। जैसा कि आप कल्पना कर सकते हैं कि इसे विशेष रूप से मजबूत नहीं होना चाहिए, क्योंकि यह केवल कुछ व्यावहारिकताओं के लिए पेश किया जाएगा।

+0

ब्याज से, आप ऐसा क्यों करना चाहते हैं? –

+0

मैंने जवाब में एक अनुभाग जोड़ा है कि मैं ऐसा क्यों करना चाहता हूं। – csgillespie

+0

यह भी देखें http://stackoverflow.com/questions/6216968/r-force-local-स्कोप –

उत्तर

4

मुझे यकीन नहीं है कि आप इसे सामान्य रूप से करना चाहते हैं, लेकिन local() फ़ंक्शन को codetools लाइब्रेरी के रूप में मदद करनी चाहिए।

अपने उदाहरण में,

f = local(function() { ... }, baseenv()) 

यह बिल्कुल आप क्या चाहते हैं नहीं करता है की कोशिश, लेकिन यह आपको करीब मिलना चाहिए।

1

आप देख सकते हैं y वैश्विक वातावरण exists('y',envir=.GlobalEnv)

3

का उपयोग कर आप एक चर इस समारोह के साथ स्थानीय संस्करण होना मजबूर कर सकते हैं में मौजूद है:

get_local <- function(variable) 
{ 
    get(variable, envir = parent.frame(), inherits = FALSE) 
} 

इन मामलों की तुलना करें

y <- 0  
f <- function() 
{ 
    x <- y 
}  
print(f())  # 0 

y <- 0  
f <- function() 
{ 
    y <- get_local("y") 
    x <- y 
}  
print(f())  # Error: 'y' not found 

आप जो कर रहे हैं उसके आधार पर, आप यह भी देखना चाहेंगे कि yf पर तर्क था , formalArgs या formals का उपयोग कर।

g <- function(x, y = TRUE, z = c("foo", "bar"), ...) 0 

formalArgs(g) 
# [1] "x" "y" "z" "..." 

formals(g) 
#$x 
# 
# 
#$y 
#[1] TRUE 
# 
#$z 
#c("foo", "bar") 
# 
#$... 

संपादित करें: के 'कैसे काम करता है की सामग्री को बदले बिना शाब्दिक scoping बंद करने के लिए' हल करने के लिए कठिन है और अधिक सामान्य बिंदु। मैं काफी हद तक निश्चित हूं कि स्कोपिंग नियम आर में बहुत अधिक शामिल हैं। एस-प्लस का उपयोग करने के लिए एक विकल्प हो सकता है, क्योंकि इसमें different scoping rules है।

0

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

इस समस्या की तरह आप अक्सर देख रहे हैं, एक आर एम (सूची = ls (माहौल = .GlobalEnv)) बात आप स्रोत मदद कर सकता है में है, तो लेकिन निश्चित रूप से है कि इस तरह कुछ भी मिटा के रूप में अन्य मुद्दों, बनाता है वे डीबगिंग के दौरान राज्य को रखने के लिए उपयोग कर रहे थे, आदि

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