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

人盡茶涼 提交于 2020-01-03 18:41:08

问题


Often the parent environment is the global environment.

But occasionally it isn't. For example in functions within functions, or in an error function in tryCatch().

Strictly speaking, does <<- assign to the global environment, or simply to the parent environment?


回答1:


Try it out:

env = new.env()
env2 = new.env(parent = env)

local(x <<- 42, env2)
ls(env)
# character(0)
ls()
# [1] "env"  "env2" "x"

But:

env$x = 1
local(x <<- 2, env2)
env$x
# [1] 2

… so <<- does walk up the entire chain of parent environments until it finds an existing object of the given name, and replaces that. However, if it doesn’t find any such object, it creates a new object in .GlobalEnv.

(The documentation states much the same. But in a case such as this nothing beats experimenting to gain a better understanding.)




回答2:


Per 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.

Use of this operator will cause R to search through the environment tree until it finds a match. The search starts at the environment in which the operator is used and moves up the stack from there. So it's not guaranteed to be a "global" assignment, but could be.

As sindri_baldur points out, if the variable is not found in any existing environment, a new one will be created at the global level.

Lastly, I should point out that use of the operator is confusing more often than it is helpful, as it breaks the otherwise highly functional nature of R programming. There's more than likely a way to avoid using <<-.



来源:https://stackoverflow.com/questions/54830589/strictly-speaking-does-the-scoping-assignment-assign-to-the-parent-environme

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!