严格来说,确定范围<

问题描述 投票:4回答:2

父环境通常是全球环境。

但偶尔也不是。例如,在函数内的函数中,或在tryCatch()中的错误函数中。

严格来说,<<-是否会分配到全球环境,还是仅仅分配给父环境?

r environment scoping
2个回答
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陈述的情况大致相同。但在这样的情况下,没有什么能比实验更好地理解。)


5
投票

根据文件:

运算符<<-->>通常仅在函数中使用,并且导致通过父环境进行搜索以查找所分配的变量的现有定义。

使用此运算符将导致R搜索环境树,直到找到匹配项。搜索从使用操作员的环境开始,然后从那里向上移动。所以它不能保证是一个“全球”的任务,但可能是。

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

最后,我应该指出,运算符的使用比它有用更容易混淆,因为它打破了R编程的高功能特性。有可能避免使用<<-

© www.soinside.com 2019 - 2024. All rights reserved.