gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:12:44 25 4
gpt4 key购买 nike

对于此代码:

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 在 f2 中使用 <-- 设置为 200。 d 不应该同样发生在 B 上吗?

最佳答案

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 ,向上遍历。它没有找到 A在任一 f2f1 ,但在全局环境中并在那里分配它。

然后您打印到旧原件 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 “分配发生在全局环境中。”

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

关于r - 了解具有可变作用域的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47691752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com