R 为什么在反复调用lappy之后,闭包中的变量值会丢失?
我试图使用一系列R 为什么在反复调用lappy之后,闭包中的变量值会丢失?,r,scope,closures,currying,lapply,R,Scope,Closures,Currying,Lapply,我试图使用一系列lappy调用来构建一个curried函数列表,理想情况下,在最后一次lappy调用时,它会返回最终的期望值。currying可以工作,但是lappy似乎总是在第二次应用后应用列表中的最后一个元素 例如: curry <- function(fn, ...) { arglist <- list(...) function(...) { do.call(fn, append(arglist, list(...))) } } # rcurry is u
lappy
调用来构建一个curried函数列表,理想情况下,在最后一次lappy
调用时,它会返回最终的期望值。currying可以工作,但是lappy
似乎总是在第二次应用后应用列表中的最后一个元素
例如:
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
}
它看起来不像是
curry
或rcurry
功能的结果。使用roxygen
的Curry
函数也可以做同样的事情。通过上面的闭包或在curry
中使用curry.afn
创建curry.a
不在功能范围内进行评估,因此它是承诺
。
如果您force
it,那么您可以得到您期望的:
curry <- function(fn, ...) {
force(fn)
arglist <- list(...)
function(...) {
do.call(fn, append(arglist, list(...)))
}
}
那么
lappy
在新环境中评估FUN
。我认为这与此有关。我认为答案和汤米对约书亚的回答是一样的。约书亚是热情的,科斯基用钉子钉住了它。谢谢大家,100%的斗牛士。非常感谢。实际上,我认为结束就是承诺,所以我做了结束
# 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
# 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
curry <- function(fn, ...) {
force(fn)
arglist <- list(...)
function(...) {
do.call(fn, append(arglist, list(...)))
}
}
> curry.a.b <- lapply(curry.a, curry, 1)
> curry.a.b[[1]](2)
[1] 13
> curry.a.b[[2]](2)
[1] 1003
>
> curry.a.b.c <- lapply(curry.a.b, curry, 2)
> lapply(curry.a.b.c, do.call, list())
[[1]]
[1] 13
[[2]]
[1] 1003
f0 <- function(i) function() i
f1 <- function(i) {force(i); function() i}
f <- local({
r0 <- list()
r1 <- list()
for (i in 1:2) {
r0[[i]] <- f0(i)
r1[[i]] <- f1(i)
}
list(r0 = r0, r1 = r1)
})
> f$r0[[1]]()
[1] 2
> f$r1[[1]]()
[1] 1
> f$r0[[2]]()
[1] 2
> f$r1[[2]]()
[1] 2