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

Strictly speaking does the scoping assignment <<- assign to the parent environment or global environment?

通常父环境全局环境。

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

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

试试看:

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 陈述大致相同。但在这种情况下,没有什么比通过实验获得更好的理解更好的了。)

根据文档:

The operators <<- and ->> are normally only used in functions, and cause a search to be made through parent environments for an existing definition of the variable being assigned.

使用此运算符将导致 R 搜索环境树,直到找到匹配项。搜索从使用运算符的环境开始,并从那里向上移动堆栈。所以它不能保证是 "global" 赋值,但 可以 是。

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

最后,我要指出的是,运算符的使用往往令人困惑,而不是有用,因为它打破了 R 编程原本高度函数化的本质。很可能有一种方法可以避免使用 <<-.