Gegeben die folgende Funktion
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
Wenn man den folgenden Code in R ausführt, warum ist die Antwort 10? Ich bin ein wenig verwirrt darüber, wie Sie in diese Frage hineinspielen.
z <- 10
f(3)
4 + 2*x
am Ende? Wobei 4 = zz1 <- 4
f(3)# [1] 16
z <- 4; environment(g) <- .GlobalEnv
und rufenz <- 10 > f(3) [1] 16
Antworten:
R verwendet lexikalisches Scoping. Wenn ein Objekt referenziert, aber nicht in einer Funktion definiert ist, wird es in der Umgebung gesucht, in der die Funktion definiert ist , und nicht in der Umgebung, aus der es aufgerufen wurde.
z wird in g referenziert, aber nicht in g definiert, so dass es sich um die Umgebung handelt, in der g definiert ist, und das ist die Umgebung innerhalb von f, also verwendet g z = 4.
Tatsächlich ist in diesem Fall die Umgebung, in der g definiert ist, dieselbe wie die Umgebung, aus der g aufgerufen wird. Daher muss jede Art, wie Sie es betrachten, z = 4 verwendet werden. Wenn Funktionen standardmäßig in der globalen Umgebung nach Objekten suchen, die nicht in der Funktion definiert sind, wird z = 10 verwendet, aber so funktioniert R nicht.
Damit es anders funktioniert
Wenn Sie aus irgendeinem Grund g zwingen möchten, in der Umgebung, in der f aufgerufen wird, nach z zu suchen, können Sie dies tun (wobei
parent.frame()
sich auf die Umgebung bezieht, aus der f aufgerufen wird).oder wir könnten verwenden,
y + envir$z
außer dass dies nur im übergeordneten Frame und nicht in seinen Vorfahren angezeigtwith
wird, wohingegen Vorfahren des übergeordneten Frames angezeigt werden, wenn sie nicht im übergeordneten Frame gefunden werden.Eine Alternative besteht darin, die Umgebung von g so zu ändern, dass
envir
nach Objekten gesucht wird, die nicht in g gefunden wurden:quelle