我正在尝试使用一系列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
}
这按预期工作:
# 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
“破坏范围”的下一个lapply
:curry
# 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
它似乎不是curry
orrcurry
函数的结果。使用roxygen
'sCurry
函数做同样的事情。通过上面的闭包创建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
这里发生了什么?