Estoy intentando utilizar una serie de llamadas a lapply
para crear una lista de funciones curried, que idealmente en la última llamada lapply
, devuelve el valor final deseado. El currying funciona, pero lapply
parece aplicar siempre el último elemento en la lista después de la segunda aplicación.¿Por qué se pierden los valores variables en cierres después de llamar repetidamente a lapply?
Ejemplo:
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
}
Esto funciona como se espera:
# 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
El siguiente lapply
de curry
"Mangles del alcance":
# 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
No parece como una resultado de la función curry
o rcurry
. El uso de la función roxygen
de Curry
hace lo mismo. creando curry.a
por cierre arriba o usando curry.a <- list(curry(myadd, 10), curry(myadd, 1000))
también resulta igual.
Y, por supuesto, el curry definitiva:
# 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
lo que está pasando aquí?
'' lapply' evalúa FUN' en un nuevo entorno. Creo que tiene algo que ver con eso. –
Creo que la respuesta es la misma que en la respuesta de Tommy a http://stackoverflow.com/questions/9950144/access-lapply-index-names-inside-fun/9950734#comment12707459_9950734 –
Joshua es cálido, kohske lo clava. Gracias a todos. –