了解具有变量范围的函数

时间:2017-12-07 09:31:11

标签: r scoping

对于此代码:

'\r'

以下是输出:

A <- 100; B <- 20

f1 <- function(a) {
  B <- 100
  f2 <- function(b) {
    A <<- 200
    B <<- 1000
  }
  f2(a)
}

f1(B)
cat(A)
cat(B)

以下是我对上述代码的理解: 使用具有值20的参数B调用函数f1。在f1内创建局部变量B(B <-100),f1.B对变量B没有影响。 初始化外部函数调用f1作为f1.B局部作用于函数f1。在f1中创建一个新函数f2,它接受单个参数b。 在f1内,调用函数f2作为参数a传递给f2。 f2没有使用它的参数b。 f2使用全局运算符&lt; - 修改A并将其设置为200.这 为什么cat(A)输出200。

我的理解是不正确的,因为当我期望1000时B被设置为20?使用&lt; - 在A中将A设置为200。对于B,不应该出现同样的情况吗?

1 个答案:

答案 0 :(得分:5)

  

使用值为20的参数B调用函数f1。

不,我不这么认为。它使用参数a调用,该参数与全局环境中的B具有相同的值。 B并未直接涉及这一点。

然后,您将100分配给另一个B,您在帖子中调用f1.B。 (请注意,按照前面的说法,此处创建B,而不是覆盖。)

然后,当使用<<-运算符时,它会在范围内遍历,从f2(不存在B)到f1,在此处找到&# 34; f1.B&#34;并指定1000。

同样,在<<-上使用A时,它会向上移动。它在Af2中找不到f1,但在全局环境中找到它并将其分配到那里。

然后打印到原始B,原来从未被修改过。

来自帮助:

  

<<-->>(...)导致通过父环境进行搜索,以查找变量的现有定义   分配。如果找到这样的变量(并且其绑定未锁定)   然后重新定义它的值,否则赋值发生在   全球环境。

因此对于B&#34;找到这样的变量&#34; ,而对于A &#34;分配发生在全球环境。&#34;

结论: <<-令人困惑,通常最好避免使用。