Ich versuche, eine Reihe von lapply
Aufrufe zu verwenden, um eine Liste der Curry-Funktionen zu erstellen, die idealerweise bei dem letzten Aufruf lapply
den endgültigen gewünschten Wert zurückgibt. Das Curry funktioniert, aber lapply
scheint immer das letzte Element in der Liste nach der zweiten Anwendung anzuwenden.Warum gehen variable Werte in Closures nach wiederholtem Aufruf von lapply verloren?
Beispiel:
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
}
Dies funktioniert wie erwartet:
# 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
Die nächste lapply
von curry
"mangles den Umfang":
# 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
Es scheint nicht, wie ein Ergebnis der curry
oder rcurry
Funktion. Mit roxygen
Curry
funktioniert die gleiche Funktion. Erstellen durch Schließung oben oder mit curry.a <- list(curry(myadd, 10), curry(myadd, 1000))
ergibt auch das gleiche.
Und die letzte Curry natürlich:
# 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
Was ist hier los?
'lapply' wertet' FUN' in einer neuen Umgebung. Ich denke, das hat etwas damit zu tun. –
Ich denke, die Antwort ist die gleiche wie in Tommys Antwort auf http://stackoverflow.com/questions/9950144/access-lapply-index-names-inside-fun/9950734#comment12707459_9950734 –
Joshua ist warm, kohske Nägel es. Danke euch allen. –