Dada la siguiente función
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
Si uno ejecuta el siguiente código en R, ¿por qué la respuesta es 10? Estoy un poco confundido acerca de cómo juega con esta pregunta.
z <- 10
f(3)
4 + 2*x
final? Donde 4 = zz1 <- 4
dentro de la función yf(3)# [1] 16
z <- 4; environment(g) <- .GlobalEnv
y luego llamez <- 10 > f(3) [1] 16
Respuestas:
R utiliza el alcance léxico, lo que significa que si se hace referencia a un objeto pero no se define en una función, se busca en el entorno en el que se define la función , no en el entorno desde el que se llamó.
Se hace referencia a z en g pero no se define en g, por lo que mira al entorno en el que se define g y ese es el entorno dentro de f, entonces g usa z = 4.
En realidad, en este caso, el entorno en el que se define g es el mismo que el entorno desde el que se llama g, por lo que debe usarse z = 4 de cualquier forma que lo mire. Si las funciones predeterminadas al entorno global para buscar objetos no definidos en la función, entonces usaría z = 10, pero no es así como funciona R.
Hacer que funcione de manera diferente
Si por alguna razón quisiera forzar a g a buscar z en el entorno en el que se llama f, entonces podría hacerlo (donde se
parent.frame()
refiere al entorno desde el que se llama f).o podríamos usar
y + envir$z
excepto que eso solo se vería en el marco primario y no en sus antepasados, mientras quewith
se vería en ancestros del marco primario si no se encuentra en el marco primario.Una alternativa es cambiar el entorno de g de esta manera para que busque
envir
objetos que no se encuentran en g:fuente