Wenn ich eine Funktion wie folgt erstellen:Können Sie die faule Auswertung in R-Funktionsoperatoren deutlicher erklären?
what_is_love <- function(f) {
function(...) {
cat('f is', f, '\n')
}
}
Und nennen Sie es mit lapply
: funs <- lapply(c('love', 'cherry'), what_is_love)
ich unerwartete Ausgabe:
> funs[[1]]()
f is cherry
> funs[[2]]()
f is cherry
Aber beachten Sie, dass dies nicht der Fall ist, wenn Sie Verwenden Sie nicht lapply
:
> f1 <- what_is_love('love')
> f2 <- what_is_love('cherry')
> f1()
f is love
> f2()
f is cherry
Was gibt?
Ich weiß, dass funs <- lapply(c('love', 'cherry'), what_is_love)
mehr geschrieben voll werden kann:
params <- c('love', 'cherry')
out <- vector('list', length(params))
for (i in seq_along(params)) {
out[[i]] <- what_is_love(params[[i]])
}
out
Aber wenn ich in zu sehen, wie ich sehe, dass beide Funktionen ihre eigene Umgebung haben:
Browse[1]> out[[1]]
function(...) {
cat('f is', f, '\n')
}
<environment: 0x109508478>
Browse[1]> out[[2]]
function(...) {
cat('f is', f, '\n')
}
<environment: 0x1094ff750>
Aber in jedem dieser Umgebungen, f
ist das gleiche ...
Browse[1]> environment(out[[1]])$f
[1] "cherry"
Browse[1]> environment(out[[2]])$f
[1] "cherry"
ich weiß w die Antwort ist "faule Bewertung", aber ich bin auf der Suche nach etwas mehr Tiefe ... Wie wird f
in beiden Umgebungen neu zugeordnet? Woher kommt f
? Wie funktioniert R Lazy Evaluation in diesem Beispiel unter der Haube?
-
EDIT: Ich bin mir dessen bewusst the other question auf lazy evaluation und Funktionalen, aber es sagt, nur die Antwort "lazy evaluation" ist, ohne zu erklären, wie die verzögerte Auswertung tatsächlich funktioniert. Ich suche eine größere Tiefe.
möglich Duplikat [Erklären Sie eine faule Auswertung Marotte] (http://stackoverflow.com/questions/16129902/explain-a-lazy-evaluation-quirk) – jangorecki
lapply keine Verhaltensweisen länger auf diese Weise in R-3.2. 0. –