【问题标题】:Strictly speaking does the scoping assignment <<- assign to the parent environment or global environment?严格来说,范围分配 <<- 是否分配给父环境或全局环境?
【发布时间】:2019-07-16 18:06:52
【问题描述】:

通常父环境全局环境。

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

严格来说,&lt;&lt;- 是分配给全局环境,还是简单地分配给父环境?

【问题讨论】:

  • 文档说,“导致通过父环境搜索正在分配的变量的现有定义。如果找到这样的变量(并且它的绑定没有锁定),那么它的值是重新定义,否则分配发生在全局环境中。”,这似乎相当直接地回答了你的问题。
  • 我在我的其他答案之一中说明了这一点:stackoverflow.com/questions/10904124/… 希望它有所帮助
  • @joran:不,这不是很清楚。搜索是自下而上的。这是暗示但没有说明(如果在不同的环境中有多次点击怎么办?)。文档可以明确。

标签: r environment scoping


【解决方案1】:

试试看:

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

...所以&lt;&lt;-确实遍历整个父环境链,直到找到给定名称的现有对象,并替换它。但是,如果它没有找到任何这样的对象,它会在 .GlobalEnv 中创建一个新对象。

The documentation 的说法大致相同。但在这种情况下,没有什么比尝试获得更好的理解更好了。)

【讨论】:

  • 不准确地说它一直持续到它到达.GlobalEnv,它一直向上,然后如果它没有找到,则在全局环境中创建它。试试attach(iris);Species &lt;&lt;- "hello";ls()mean &lt;&lt;- "bar"
  • @Moody_Mudskipper 对,我修正了措辞。
【解决方案2】:

根据文档:

运算符&lt;&lt;--&gt;&gt; 通常只用在函数中,并导致通过父环境搜索被分配变量的现有定义。

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

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

最后,我应该指出,操作符的使用经常令人困惑,而不是有用,因为它破坏了 R 编程在其他方面的高度功能性。很可能有一种方法可以避免使用&lt;&lt;-

【讨论】:

  • 找不到匹配项怎么办?然后它将在全局环境中创建一个新变量。对吗?
  • 是的,如果变量不存在,则创建一个新变量。
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 2021-09-24
相关资源
最近更新 更多