Dada a seguinte função
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
Se corre-se o seguinte código no R porque é a resposta de 10? Estou um pouco confuso sobre como y desempenha essa questão.
z <- 10
f(3)
R usa escopo lexical o que significa que se um objecto é referenciado mas não definido em uma função, então ele é procurado no ambiente em que a função é definida , não o meio ambiente a partir do qual ele foi chamado.
z é referenciado em g mas não está definido no g de modo que parece para o ambiente em que g é definido e que é o ambiente dentro f assim g utiliza z = 4.
Na verdade, neste caso, o ambiente que g é definido no é o mesmo que o ambiente do qual g é chamado assim qualquer maneira você olhar para ele z = 4 deve ser utilizado. Se as funções padrão para o ambiente global para procurar objetos não definidos na função, então ele usaria z = 10, mas que não é como funciona a R.
Fazê-lo funcionar de forma diferente
Se por algum motivo você queria forçar g de olhar para z no ambiente em que f é chamado, em seguida, você poderia fazer isso (onde parent.frame()
refere-se ao ambiente do qual f é chamado).
f2 <- function(x, envir = parent.frame()) {
g <- function(y) {
y + with(envir, z)
}
z <- 4
x + g(x)
}
z <- 10
f2(3)
## [1] 16
ou poderíamos usar y + envir$z
exceto que que só ficaria no quadro pai e não em seus antepassados enquanto with
vai olhar na antepassados do quadro pai se não for encontrado no quadro pai.
Uma alternativa é ambiente de mudança de g como esta para que fique em envir
para objetos que não são encontrados em g:
f3 <- function(x, envir = parent.frame()) {
g <- function(y) {
y + z
}
environment(g) <- envir
z <- 4
x + g(x)
}
z <- 10
f3(3)
## [1] 16