了解具有变量范围的函数

对于此代码:

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

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

我的理解是不正确的,因为当我期望1000时B被设置为20?使用< - 在A中将A设置为200.对于B,d应该也不一样吗?

最佳答案

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

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

然后,您将100分配给不同的B,您在帖子中调用f1.B. (注意,按照前面的语句,在此处创建B,不会被覆盖.)

然后当使用<< - 运算符时,它遍历范围,从f2(其中没有B存在)到f1,在那里它找到“f1.B”并分配1000. 类似地,当在A上使用<< - 时,它会向上遍历.它在f2或f1中都没有找到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,“找到这样的变量”,而对于A“赋值发生在全球环境中”.

结论:<< - 令人困惑,并且通常更好地避免.

转载注明原文:了解具有变量范围的函数 - 代码日志