मैं दोहराए गए कार्यों के लिए कुछ फ़ंक्शन लिख रहा हूं, लेकिन मैं डेटा लोड करने की मात्रा को कम करने की कोशिश कर रहा हूं। असल में मेरे पास एक ऐसा कार्य है जो कुछ जानकारी लेता है और साजिश बनाता है। फिर मेरे पास एक दूसरा फ़ंक्शन है जो एकाधिक प्लॉट्स को .pdf पर लूप करेगा और आउटपुट करेगा। दोनों कार्यों में मैं कोड की निम्न पंक्ति है:नेस्टेड फ़ंक्शन पर्यावरण चयन
if(load.dat) load("myworkspace.RData")
जहां load.dat
एक तार्किक और डेटा की आवश्यकता myworkspace.RData में संग्रहीत किया जाता है। जब मैं रैपर फ़ंक्शन को कॉल कर रहा हूं जो कई प्लॉट्स के माध्यम से लूप करता है और आउटपुट करता है, तो मैं प्रत्येक कॉल में वर्कस्पेस को आंतरिक फ़ंक्शन पर फिर से लोड नहीं करना चाहता हूं। मैंने सोचा कि मैं रैपर फ़ंक्शन में एक बार वर्कस्पेस लोड कर सकता हूं, फिर आंतरिक फ़ंक्शन उस डेटा तक पहुंच सकता है, लेकिन मुझे अन्यथा बताई गई त्रुटि मिली।
तो मेरी समझ तब थी जब कोई फ़ंक्शन अपने स्थानीय वातावरण में चर नहीं ढूंढ सकता (जब फ़ंक्शन कहलाता है) बनाया जाता है, तो फ़ंक्शन चर के लिए मूल वातावरण को देखेगा।
मुझे लगता है कि आंतरिक फ़ंक्शन कॉल में मूल वातावरण बाहरी फ़ंक्शन कॉल होगा। जाहिर है यह सच नहीं है:
func1 <- function(...){
print(var1)
}
func2 <- function(...){
var1 <- "hello"
func1(...)
}
> func2()
Error in print(var1) : object 'var1' not found
कई सवाल, भाषा के मैनुअल, और this वास्तव में उपयोगी ब्लॉग पोस्ट पढ़ने के बाद, मैं के साथ आया था निम्नलिखित:
var1 <- "hello"
save(list="var1",file="test.RData")
rm(var1)
func3 <- function(...){
attach("test.RData")
func1(...)
detach("file:test.RData")
}
> func3()
[1] "hello"
वहाँ करने के लिए एक बेहतर तरीका है इस? func1
func2
द्वारा बनाए गए स्थानीय वातावरण में अपरिभाषित चर के लिए क्यों नहीं दिखता है, जब यह func2
था जिसे func1
कहा जाता है?
नोट: मुझे नहीं पता था कि इस सवाल को कैसे नामित किया जाए। अगर किसी के पास बेहतर सुझाव हैं तो मैं इसे बदल दूंगा और इस लाइन को संपादित कर दूंगा।
बंद
शाब्दिक scoping का लिंक जोड़ का मतलब समारोह अपनी मूल वातावरण है, जो जरूरी बुला वातावरण नहीं है में अपरिभाषित प्रतीकों के लिए दिखेगा। इसे भी देखें: https://github.com/hadley/devtools/wiki/Environments –
@ Ferdinand.kraft लिंक के लिए धन्यवाद। मैं इस दोपहर के माध्यम से काम करूंगा। – dayne
यदि आपका डेटा डेटाफ्रेम के रूप में है, तो आप पैकेज 'data.table' का उपयोग कर सकते हैं, और' func3' के अंदर 'func1'' के तर्क के रूप में अपनी तालिकाओं को पास कर सकते हैं। यह पैकेज संदर्भ द्वारा काम करता है और आपके डेटा की अवांछित प्रतियां नहीं बनाता है। –