अद्यतन 2 @G। ग्रोथेंडिक ने दो दृष्टिकोण पोस्ट किए। दूसरा एक फ़ंक्शन के अंदर फ़ंक्शन वातावरण बदल रहा है। यह बहुत अधिक कोडिंग प्रतिकृतियों की मेरी समस्या हल करता है। मुझे यकीन नहीं है कि पैकेज में मेरी स्क्रिप्ट बनाने के दौरान सीआरएएन जांच से गुज़रने के लिए यह एक अच्छी विधि है। जब मेरे पास कुछ निष्कर्ष हैं तो मैं फिर से अपडेट करूंगा।आर में, इस फ़ंक्शन के अंदर निचले स्तर के फ़ंक्शन पर उपलब्ध फ़ंक्शन के अंदर चर बनाने के लिए कैसे? (के साथ, संलग्न, पर्यावरण)
अद्यतन
मैं f2
के लिए इनपुट तर्क चर का एक बहुत पारित करने के लिए कोशिश कर रहा हूँ और है env$c, env$d, env$calls
के रूप में समारोह के अंदर हर चर सूचकांक नहीं चाहता, यही वजह है कि मैं f5
और f6
में with
का उपयोग करने की कोशिश की (एक संशोधित f2
)। हालांकि, assign
{}
अंदर with
साथ काम नहीं करता, बाहर with
assign
चलती काम करेगा लेकिन मेरा असली मामले में मैं जो मैं कितनी आसानी से with
समारोह से बाहर उन्हें स्थानांतरित करने नहीं जानते with
भाव अंदर कुछ assign
रों है । ,
## In the <environment: R_GlobalEnv>
a <- 1
b <- 2
f1 <- function(){
c <- 3
d <- 4
f2 <- function(P){
assign("calls", calls+1, inherits=TRUE)
print(calls)
return(P+c+d)
}
calls <- 0
v <- vector()
for(i in 1:10){
v[i] <- f2(P=0)
c <- c+1
d <- d+1
}
return(v)
}
f1()
समारोह f2
f1
अंदर है, जब f2
कहा जाता है यह पर्यावरण environment(f1)
में चर calls,c,d
के लिए लग रहा है:
यहाँ एक उदाहरण है। मुझे यही चाहिए था।
हालांकि, जब मैं f2
का उपयोग अन्य कार्यों में भी करना चाहता हूं, तो मैं इस समारोह को वैश्विक वातावरण में परिभाषित कर दूंगा, इसे f4
पर कॉल करें।
f4 <- function(P){
assign("calls", calls+1, inherits=TRUE)
print(calls)
return(P+c+d)
}
यह काम नहीं करेगा क्योंकि यह वैश्विक वातावरण में के बजाय एक समारोह जहां समारोह कहा जाता है के अंदर calls,c,d
के लिए दिखेगा। उदाहरण के लिए:
f3 <- function(){
c <- 3
d <- 4
calls <- 0
v <- vector()
for(i in 1:10){
v[i] <- f4(P=0) ## or replace here with f5(P=0)
c <- c+1
d <- d+1
}
return(v)
}
f3()
सुरक्षित तरीका f4
के इनपुट बहस में calls,c,d
को परिभाषित किया जाना चाहिए और फिर f4
में इन मानकों गुजरती हैं। हालांकि, मेरे मामले में, इस फ़ंक्शन f4
में पारित होने के लिए बहुत सारे चर हैं और यह बेहतर होगा कि मैं इसे पर्यावरण के रूप में पास कर सकूं और f4
वैश्विक पर्यावरण (environment(f4)
) में न देखें, केवल environment
के अंदर देखें जब f3
कहा जाता है।
जिस तरह से मैं इसे हल करता हूं, वह पर्यावरण को एक सूची के रूप में उपयोग करना और with
फ़ंक्शन का उपयोग करना है।
f5 <- function(P,liste){
with(liste,{
assign("calls", calls+1, inherits=TRUE)
print(calls)
return(P+c+d)
}
)
}
f3 <- function(){
c <- 3
d <- 4
calls <- 0
v <- vector()
for(i in 1:10){
v[i] <- f5(P=0,as.list(environment())) ## or replace here with f5(P=0)
c <- c+1
d <- d+1
}
return(v)
}
f3()
हालांकि, अब assign("calls", calls+1, inherits=TRUE)
के रूप में यह assign
के बाद से होना चाहिए मूल वस्तु संशोधित नहीं करता है काम नहीं करता। परिवर्तनीय calls
एक अनुकूलन समारोह से जुड़ा हुआ है जहां उद्देश्य कार्य f5
है। इनपुट तर्क के रूप में calls
पास करने के बजाय assign
का उपयोग करने का यही कारण है। attach
का उपयोग करना मुझे भी स्पष्ट नहीं है।
f7 <- function(P,calls,liste){
##calls <<- calls+1
##browser()
assign("calls", calls+1, inherits=TRUE,envir = sys.frame(-1))
print(calls)
with(liste,{
print(paste('with the listed envrionment, calls=',calls))
return(P+c+d)
}
)
}
########
##################
f8 <- function(){
c <- 3
d <- 4
calls <- 0
v <- vector()
for(i in 1:10){
##browser()
##v[i] <- f4(P=0) ## or replace here with f5(P=0)
v[i] <- f7(P=0,calls,liste=as.list(environment()))
c <- c+1
d <- d+1
}
f7(P=0,calls,liste=as.list(environment()))
print(paste('final call number',calls))
return(v)
}
f8()
मुझे यकीन है कि यह कैसे सही दिशा पर आर एम आई में किया जाना चाहिए नहीं कर रहा हूँ, खासकर जब क्रैन के माध्यम से गुजर जाँच,: यहाँ assign
समस्या को दूर करने के लिए अपने तरीका है? किसी के पास इस पर कुछ संकेत हैं?
यह परिणाम मुझे देता है लेकिन मैंने स्पष्ट रूप से मेरा अनुरोध नहीं लिखा है। असल में, मैं 'f2' में गुजरने वाले सभी चरों को इंडेक्स से बचना चाहता हूं, यानी, 'env $' लिखना नहीं, इसलिए मैंने 'with' का उपयोग करने का प्रयास किया। मैं 'f2' के अंदर बाहरी 'कॉल' को संशोधित करने में सक्षम होना चाहता हूं लेकिन वर्तमान वातावरण में अन्य चर को नहीं बदलना चाहता हूं। मैं सवाल अपडेट करूंगा। – Zhenglei
मैंने एक दूसरा दृष्टिकोण जोड़ा है। –
ऐसा लगता है कि मुझे क्या चाहिए। मैं इसे अपने असली मामले के साथ परीक्षण करूँगा और बाद में अपडेट करूंगा। मदद के लिए बहुत - बहुत धन्यवाद! – Zhenglei