Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为什么在反复调用lappy之后,闭包中的变量值会丢失?_R_Scope_Closures_Currying_Lapply - Fatal编程技术网

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.a
fn
创建
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