Incluindo variáveis dentro do loop for
Portanto, considere o seguinte pedaço de código que não funciona, como a maioria das pessoas espera que
#cartoon example
a <- c(3,7,11)
f <- list()
#manual initialization
f[[1]]<-function(x) a[1]+x
f[[2]]<-function(x) a[2]+x
f[[3]]<-function(x) a[3]+x
#desired result for the rest of the examples
f[[1]](1)
# [1] 4
f[[3]](1)
# [1] 12
#attempted automation
for(i in 1:3) {
f[[i]] <- function(x) a[i]+x
}
f[[1]](1)
# [1] 12
f[[3]](1)
# [1] 12
Observe que obtemos 12 ambas as vezes depois que tentamos "automatizar". O problema é, obviamente, quei
não está sendo incluído no ambiente privado da função. Todas as funções se referem à mesmai
no ambiente global (que pode ter apenas um valor), pois um loop for não parece criar um ambiente diferente para cada iteração.
sapply(f, environment)
# [[1]]
# <environment: R_GlobalEnv>
# [[2]]
# <environment: R_GlobalEnv>
# [[3]]
# <environment: R_GlobalEnv>
Então eu pensei que poderia me dar bem com o uso delocal()
eforce()
para capturar oi
valor
for(i in 1:3) {
f[[i]] <- local({force(i); function(x) a[i]+x})
}
f[[1]](1)
# [1] 12
f[[3]](1)
# [1] 12
mas isso ainda não funciona. Eu posso ver que todos eles têm ambientes diferentes (viasapply(f, environment)
) no entanto, eles parecem estar vazios (ls.str(envir=environment(f[[1]]))
) Compare isso com
for(i in 1:3) {
f[[i]] <- local({ai<-i; function(x) a[ai]+x})
}
f[[1]](1)
# [1] 4
f[[3]](1)
# [1] 12
ls.str(envir=environment(f[[1]]))
# ai : int 1
ls.str(envir=environment(f[[3]]))
# ai : int 3
Tão claramente oforce()
não está funcionando como eu esperava. Eu estava assumindo que capturaria o valor atual dei
no ambiente atual. É útil em casos como
#bad
f <- lapply(1:3, function(i) function(x) a[i]+x)
#good
f <- lapply(1:3, function(i) {force(i); function(x) a[i]+x})
Ondei
é passado como um parâmetro / promessa, mas não deve ser o que está acontecendo no loop for.
Então, minha pergunta é: é possível criar essa lista de funções semlocal()
e renomeação de variável? Existe uma função mais apropriada do queforce()
que capturará o valor de uma variável de um quadro pai no ambiente local / atual?