代码之家  ›  专栏  ›  技术社区  ›  stevec Zxeenu

严格地说,作用域分配是分配给父环境还是全局环境?

r
  •  2
  • stevec Zxeenu  · 技术社区  · 6 年前

    通常是父环境 全球环境。

    但有时情况并非如此。例如,在函数中的函数中,或在中的错误函数中 tryCatch() .

    严格地说,是的 <<- 分配给全局环境,还是只分配给父环境?

    2 回复  |  直到 6 年前
        1
  •  8
  •   Konrad Rudolph    6 年前

    试试看:

    env = new.env()
    env2 = new.env(parent = env)
    
    local(x <<- 42, env2)
    ls(env)
    # character(0)
    ls()
    # [1] "env"  "env2" "x"
    

    但是:

    env$x = 1
    local(x <<- 2, env2)
    env$x
    # [1] 2
    

    所以 <<- 遍历父环境的整个链,直到找到具有给定名称的现有对象,并替换该对象。但是,如果找不到任何这样的对象,它将在中创建一个新对象 .GlobalEnv .

    ( The documentation

        2
  •  5
  •   jdobres    6 年前

    根据文件:

    操作员 <<- ->> 通常只在函数中使用,并导致通过父环境搜索正在分配的变量的现有定义。

    使用此运算符将导致R在环境树中搜索,直到找到匹配项。搜索从使用运算符的环境开始,并从那里向上移动堆栈。所以不能保证是“全球”任务,但是 能够 是的。

    最后,我要指出的是,运算符的使用往往是令人困惑的,而不是它的帮助,因为它打破了R编程在其他方面高度功能化的本质。有很多方法可以避免使用 <<- .