R 中的作用域是如何工作的?

How does scoping work in R?

a <- 10
f <- function(){
    a <<- 3
    function() {
      a <<- 15
      a <- 5
      return(a)
    }
}
g <- f()
g()
a

当我 运行 上述代码时,我得到以下输出:

5

15

谁能解释一下为什么第二个输出是 15 而不是 3?当我在函数 f.

中不使用“<<-”时,相同的代码 returns 10

看看你的功能是什么f returns.

f()
function() {
      a <<- 15
      a <- 5
      return(a)
    }
<environment: 0x000000001f1c7898>

因此,当您将此结果(一个函数)分配给 g 时,它将成为上面输出中的那个函数。当您调用 g.
时,代码行 a <<- 3 从未 执行 换句话说,第二个输出的解释方式与第一个输出的解释方式相同,gglobalenv 中存在的变量 a 设置为 15 和 returns 在其自身环境中创建的变量 a <- 5 的值。

编辑。
请注意,如果像 Dason 在他的评论中所说的那样,在调用 g 之前打印 a,它的值已更改为 3,就像您在问题中所期望的那样。调用 f 时确实执行了代码行 a <<- 3

g <- f()   # call 'f'

a          # print 'a', the value has changed
[1] 3

g()        # now call 'g'
[1] 5

a          # and the value of 'a' changed again
[1] 15