一連の呼び出しを使用して、理想的には最後の呼び出しで最終的な目的の値を返すlapply
カリー化された関数のリストを作成しようとしています。lapply
カリー化は機能しますがlapply
、2 番目のアプリケーションの後に常にリストの最後の要素を適用するようです。
例:
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
の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
何が起きてる?