了解具有可变作用域的函数
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
上使用<<-
时,也是向上遍历。它在 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
、"such a variable is found",而对于 A
"assignment takes place in the global environment."
结论: <<-
令人困惑,通常最好避免。
对于此代码:
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
上使用<<-
时,也是向上遍历。它在 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
、"such a variable is found",而对于 A
"assignment takes place in the global environment."
结论: <<-
令人困惑,通常最好避免。