Escopo e avaliação de funções em R

nzhanggh:

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)
G. Grothendieck:

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$zexceto que que só ficaria no quadro pai e não em seus antepassados enquanto withvai 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 envirpara 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

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=369962&siteId=1
Recomendado
Clasificación