gpt4 book ai didi

r - 为什么在函数中使用变量会在使用超赋值 (<<-) 运算符时更改 R 中返回的值?

转载 作者:行者123 更新时间:2023-12-05 03:33:52 24 4
gpt4 key购买 nike

为什么 bar 和 baz 的行为不同?当调用 bar 时,a 的打印值和全局范围内的 a 值是相同的,但是当调用 baz 时,打印值和全局范围内的值不同。看起来,唯一的区别是在父环境中使用(但未定义)a。

a = 1:3
b = 4
foo <- function(a) {
a[1] <<- b
print(a)
}

bar <- function(a) {
foo(a)
}

baz <- function(a) {
a
foo(a)
}

bar(a) # 4 2 3
a # 4 2 3

a <- 1:3
baz(a) # 1 2 3
a # 1 2 3

最佳答案

复杂赋值运算符<<-更改父环境中变量的值。当bar被称为:

  • 它通过了 afoo
  • foo然后更改 a 的第一个元素的值至 4在全局环境中
  • 之后foo版画 a
> bar(a) # 4 2 3
[1] 4 2 3

这里唯一要注意的是,因为foo在全局环境中创建,它搜索 b 的值通过在创建它的环境中的词法范围界定,这又是全局环境。 foo 时就是这种情况版画 a最后,它再次在创建它的环境即全局环境中寻找它的值(value)。所以 a将更改为 c(4, 2, 3) .

但是,当您调用 baz ,

  • 它首先打印a这是原来的c(1, 2, 3)
  • 然后将其传递给 foo发生我上面解释的相同事情的地方

这就是为什么第一个打印品是原版的原因 a第二个是修改后的。

我们在评论中讨论的恢复:

  • baz 中的第一行代码(第一行)是 a,相当于 print(a)。在你的第二个 baz 中,输出是相同的,因为第一行代码的输出没有返回。无论您使用均值还是总和。如果你想要输出,你应该使用 print() 并强制它返回。在这种情况下,foo(a) 的输出将不会返回。但是如果你想要两者,你可以只使用一个列表,例如
  • 输出仍然是 1:3 的另一个原因与 mean 无关,这是因为 foo。因为它改变了全局环境中对象 a 的第一个值。但随后它会打印参数 a 的值。 foo 通过全局 env 中的词法范围找到的自由变量 a 与您将自己分配给 baz 的参数 a 之间存在差异。然后传递给 foo
  • 请注意,在第一个 baz 中使用 a就像使用 print(a) 所以无论打印什么都是 baz 的结果不违背我上面的解释
  • 您可以使用 rm(a) 从全局环境中删除 a 并使用 baz <- function(a) { foo(a) } and baz(c(1,2,3)更好地区分对象 a和参数 a

关于r - 为什么在函数中使用变量会在使用超赋值 (<<-) 运算符时更改 R 中返回的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70268741/

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