我正在尝试解释有关R的演示文稿的作用域和调试。我正在阅读<<-的帮助文件,并看到这样说:


运算符<>通常仅在函数中使用,并且
导致通过父环境进行现有的搜索
分配变量的定义。如果找到这样的变量
(并且其绑定未锁定),然后重新定义其值,否则
任务发生在全球环境中。


但是我认为这并不能完全描述<<-的作用。这是一个函数:

do.func <- function() {
  x <- 1
  {
    x<<-0
  }
  print(x)
}

do.func()
x


产生以下输出:

>     do.func()
[1] 1
>     x
[1] 0


看来<<-的工作直接针对全球环境。这样对吗?

最佳答案

这是使情况更加清楚的一种尝试。

该函数可以通过以下方式重写:

do.func <- function() {
  `<-`(x, 1)
  `{`(x <<- 0)
  print(x)
}


这样弄清楚(仅函数调用)可以清楚地说明正在发生的事情。 {块内的部分尤其由两个功能组成:

`{` (`<<-`(x, 0) )


内的功能:

`<<-`(variable, value)


将值分配给变量并隐式返回。例如:

> ( `<<-`(x, 2) )
[1] 2


因此-在与x相同的环境中进行评估(在您的示例中)。因此,此块中发生了什么:

{
  x<<-0
}


第一个x会被覆盖,只有在x的值传递给函数{后,该函数会简单地返回最后一个表达式。

也可以看看:

help(`{`)

08-25 21:15