父环境 通常是全局环境。
但是有时候不是。例如,在函数内的函数中,或在tryCatch()
中的错误函数中。
严格来说,<<-
是分配给全局环境还是仅分配给父环境?
答案 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编程原本具有的高功能性。更有可能避免使用<<-
。