代码之家  ›  专栏  ›  技术社区  ›  Abishek

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

  •  1
  • Abishek  · 技术社区  · 7 年前
    a <- 10
    f <- function(){
        a <<- 3
        function() {
          a <<- 15
          a <- 5
          return(a)
        }
    }
    g <- f()
    g()
    a
    

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

    5.

    15

    有人能解释一下为什么第二个输出是15而不是3吗?当我在函数f中不使用“<-”时,相同的代码为a返回10。

    1 回复  |  直到 4 年前
        1
  •  2
  •   Rui Barradas    7 年前

    看看你的功能是什么 f 返回。

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

    所以当你把这个结果,一个函数,赋给 g 它成为上述输出中的函数。代码行 a <<- 3 从不 在您呼叫时执行 g .
    换句话说,以与解释第一个输出相同的方式解释第二个输出, g 设置变量 a globalenv 15 并返回变量值 a <- 5

    编辑。
    请注意,如果像Dason在评论中所说的那样,打印 通话前 g 其值已更改为 3 就像你在问题中所期望的那样。代码行 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