了解具有可变作用域的函数

Understanding functions with variable scoping

对于此代码:

A <- 100; B <- 20

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

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

以下是输出:

> cat(A)
200
> cat(B)
20

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

我的理解不正确,因为 B 设置为 20 而我期望 1000?由于 A 在 f2 中使用 <-- 设置为 200。 d 不应该也发生在 B 上吗?

The function f1 is invoked with parameter B that has value 20.

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

然后您将 100 分配给另一个 B,您在 post 中将其称为 f1.B。 (请注意,按照前面的语句,B 是在此处创建的,而不是被覆盖。)

然后当使用 <<- 运算符时,它在范围内向上遍历,从 f2(不存在 B)到 f1,它找到这个“f1.B”并分配一个 1000。

同理,在A上使用<<-时,也是向上遍历。它在 f2f1 中找不到 A,但在全局环境中找到并在那里分配它。

然后打印到从未更改过的旧原件 B

来自帮助:

<<- and ->> (...) cause a search to be made through parent environments for an existing definition of the variable being assigned. If such a variable is found (and its binding is not locked) then its value is redefined, otherwise assignment takes place in the global environment.

因此对于 B"such a variable is found",而对于 A "assignment takes place in the global environment."

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