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?

questionAnswers(3)

yourAnswerToTheQuestion