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

时间:2019-02-22 15:45:29

标签: r environment scoping

父环境 通常是全局环境。

但是有时候不是。例如,在函数内的函数中,或在tryCatch()中的错误函数中。

严格来说,<<-是分配给全局环境还是仅分配给父环境?

2 个答案:

答案 0 :(得分:8)

尝试一下:

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的陈述大体相同。但是在这种情况下,尝试获得更好的理解无可厚非。)

答案 1 :(得分:5)

根据文档:

  

运算符<<-->>通常仅在函数中使用,并导致在父环境中搜索要分配的变量的现有定义。

使用该运算符将使R搜索环境树,直到找到匹配项。搜索从使用操作员的环境开始,然后从那里向上移动堆栈。因此,不能保证是“全局”分配,但是可以是。

正如sindri_baldur所指出的,如果在任何现有环境中都找不到该变量,那么将在全局级别上创建一个新变量。

最后,我应该指出,使用运算符会使人更困惑,而不是有所帮助,因为它破坏了R编程原本具有的高功能性。更有可能避免使用<<-