Dada a seguinte função
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
Se alguém executa o seguinte código em R, por que a resposta é 10? Estou um pouco confuso sobre como y se encaixa nessa questão.
z <- 10
f(3)
4 + 2*x
no final? Onde 4 = zz1 <- 4
dentro da função ef(3)# [1] 16
z <- 4; environment(g) <- .GlobalEnv
e depois chamez <- 10 > f(3) [1] 16
Respostas:
R usa o escopo lexical, o que significa que, se um objeto é referenciado, mas não definido em uma função, ele é procurado no ambiente em que a função está definida , não no ambiente do qual foi chamado.
z é referenciado em g, mas não é definido em g; portanto, ele olha para o ambiente em que g está definido e esse é o ambiente em f; portanto, g usa z = 4.
Na verdade, nesse caso, o ambiente em que g é definido é o mesmo que o ambiente em que g é chamado; portanto, de qualquer maneira que você o veja, z = 4 deve ser usado. Se as funções padronizadas no ambiente global para procurar objetos não definidos na função, ele usaria z = 10, mas não é assim que R funciona.
Fazendo funcionar de maneira diferente
Se, por algum motivo, você quiser forçar g a procurar z no ambiente em que f é chamado, você poderá fazer isso (onde
parent.frame()
se refere ao ambiente a partir do qual f é chamado).ou poderíamos usar,
y + envir$z
exceto que isso pareceria apenas no quadro pai e não em seus ancestrais, ao passowith
que procurará nos ancestrais do quadro pai, se não encontrado no quadro pai.Uma alternativa é alterar o ambiente de g dessa maneira, para procurar
envir
objetos não encontrados em g:fonte