Enclosing Variablen innerhalb von for loop

So betrachten Sie das folgende Stück Code, das nicht funktioniert, wie die meisten Leute es erwarten könnten

#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

Beachten Sie, dass wir beide Male 12 erhalten, nachdem wir versucht haben, "zu automatisieren". Das Problem ist natürlich, dassi wird nicht in die private Umgebung der Funktion eingeschlossen. Alle Funktionen beziehen sich auf das gleichei in der globalen Umgebung (die nur einen Wert haben kann), da eine for-Schleife nicht für jede Iteration eine andere Umgebung zu erstellen scheint.

sapply(f, environment)
# [[1]]
# <environment: R_GlobalEnv>
# [[2]]
# <environment: R_GlobalEnv>
# [[3]]
# <environment: R_GlobalEnv>

So ich obwohl ich mit der Verwendung von @ umgehen könnlocal() undforce(), um das @ zu erfassi Wer

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

Aber das funktioniert immer noch nicht. Ich kann sehen, dass sie alle unterschiedliche Umgebungen haben (übersapply(f, environment)) jedoch scheinen sie leer zu sein ls.str(envir=environment(f[[1]]))). Vergleichen Sie dies mit

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

Also klar dasforce() funktioniert nicht so, wie ich es erwartet hatte. Ich ging davon aus, dass es den aktuellen Wert von @ erfassen würi in die aktuelle Umgebung. Es ist nützlich in Fällen wie

#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})

woi wird als Parameter / Versprechen übergeben, aber dies darf nicht das sein, was in der for-Schleife passiert.

Also meine Frage ist: Es ist möglich, diese Liste von Funktionen zu erstellen, ohnelocal() und Variablen umbenennen? Gibt es eine passendere Funktion alsforce() das erfasst den Wert einer Variablen aus einem übergeordneten Frame in der lokalen / aktuellen Umgebung?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage