父环境通常是全球环境。
但偶尔也不是。例如,在函数内的函数中,或在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陈述的情况大致相同。但在这样的情况下,没有什么能比实验更好地理解。)
根据文件:
运算符
<<-
和->>
通常仅在函数中使用,并且导致通过父环境进行搜索以查找所分配的变量的现有定义。
使用此运算符将导致R搜索环境树,直到找到匹配项。搜索从使用操作员的环境开始,然后从那里向上移动。所以它不能保证是一个“全球”的任务,但可能是。
正如sindri_baldur指出的那样,如果在任何现有环境中找不到该变量,将在全局级别创建一个新变量。
最后,我应该指出,运算符的使用比它有用更容易混淆,因为它打破了R编程的高功能特性。有可能避免使用<<-
。