मैं lapply
कॉल की एक श्रृंखला का उपयोग करने की कोशिश कर रहा हूं, जो कि करीबी कार्यों की एक सूची बनाने के लिए कॉल करता है, जो आदर्श रूप से अंतिम lapply
कॉल पर अंतिम वांछित मान देता है। करीबी काम करता है, लेकिन lapply
दूसरे एप्लिकेशन के बाद हमेशा सूची में अंतिम तत्व लागू होता प्रतीत होता है।बार-बार कॉलिंग के बाद बंद होने में परिवर्तनीय मूल्य क्यों खो रहे हैं?
उदाहरण:
curry <- function(fn, ...) {
arglist <- list(...)
function(...) {
do.call(fn, append(arglist, list(...)))
}
}
# rcurry is used only to init the first lapply.
rcurry <- function(v1, fn, ...) {
arglist <- append(list(v1), list(...))
function(...) {
do.call(fn, append(arglist, list(...)))
}
}
myadd <- function(a,b,c) {
a+b+c
}
यह अपेक्षा के अनुरूप काम करता है:
# this does give the desired output:
# curry.a.b <- list(curry(curry.a[[1]], 1), curry(curry.a[[2]], 1))
curry.a.b <- lapply(curry.a, curry, 1)
curry.a.b[[1]](2)
curry.a.b[[2]](2)
# > [1] 1003
# > [1] 1003
यह एक तरह प्रतीत नहीं होता:
# you can achieve the same by closure:
# curry.a <- lapply(c(10, 1000), FUN = function(a) { curry(myadd, a) })
curry.a <- lapply(list(10, 1000), rcurry, myadd)
curry.a[[1]](1,2)
curry.a[[2]](1,2)
# > [1] 13
# > [1] 1003
curry
की अगली lapply
"गुंजाइश mangles" curry
या rcurry
फ़ंक्शन का परिणाम। roxygen
का Curry
फ़ंक्शन का उपयोग करना वही काम करता है। curry.a
को ऊपर बंद करके या curry.a <- list(curry(myadd, 10), curry(myadd, 1000))
का उपयोग करके भी इसका परिणाम बनाते हैं।
और निश्चित रूप से अंतिम करी:
# it doesn't work if you re-define this:
# curry.a.b <- list(curry(curry.a[[1]], 1), curry(curry.a[[2]], 2))
curry.a.b.c <- lapply(curry.a.b, curry, 2)
lapply(curry.a.b.c, do.call, list())
# > [1] 1003
# > [1] 1003
यहाँ क्या हो रहा है?
'lapply' एक नए माहौल में' FUN' मूल्यांकन करता है। मुझे लगता है कि इसके साथ कुछ करने के लिए है। –
मुझे लगता है कि उत्तर टॉमी के जवाब में है जैसे http://stackoverflow.com/questions/9950144/access-lapply-index-names-inside-fun/9950734#comment12707459_9950734 –
जोशुआ गर्म है, कोहस्के इसे नाखून करता है। आप सभी को धन्यवाद। –