提问人:littletennis 提问时间:11/19/2022 最后编辑:littletennis 更新时间:11/20/2022 访问量:68
r-全局赋值如何影响函数内部?(特别是有 2 个全球任务)
r-How the global assignment affect inside the function?(Especially there are 2 global assignments)
问:
我有一个关于全局分配的问题。这是一个小例子。我想问一下为什么第二个全局分配不影响函数内部?以及为什么函数的返回输出与运行函数后在函数外部调用的输出不同)
谢谢!
答:
1赞
Josh White
11/19/2022
#1
这是我的解释,它非常复杂,但我已经尽力了:
- 在第一行中,您将 X 分配给全局环境中的矩阵 3
a_function
- 在第二行中,你取了 ,将每个元素加 4,然后将其分配给 In the Global Environment (with ),覆盖 In the Global Environment 的上一个值。但更有趣的是(并且很难从代码中看到/取消),是函数环境中发生的事情。由于延迟求值,现在是 R 在函数环境中找到一个值的时候——它计算 promise,即在函数的封闭环境中计算表达式。我们只是将 3 的矩阵绑定到全球环境中。所以现在函数环境中的值也是 3s 的矩阵。
X
X
<<-
X
X
X
X
X
X
- 这就解释了为什么当你调用它时会返回 3 的矩阵。
a_function(X)
- 然后,当在全局环境中计算表达式时,它会返回 7s 的矩阵(因为您使用 ) 从函数中全局分配了它。
X
<<-
评论
0赞
littletennis
11/20/2022
谢谢你的解释。我不明白“it evaluates the promise, is to evaluate expression X in the enclosure environment of the function”这句话。你能进一步解释一下吗?
1赞
Josh White
11/20/2022
有关 R: adv-r.hadley.nz/functions.html#promises 中 promise 的讨论,请参阅此处。基本上,它们是 R 的延迟求值的幂,在这种求值中,函数的参数不是在函数调用开始时计算的,而是在首次访问该参数时计算的。
1赞
Josh White
11/20/2022
您的新示例遵循与第一个示例完全相同的过程,但更简单一些。当 中首次引用时,R 必须找到函数中绑定到的值。它通过查看全局环境(即函数的封闭环境)来获取 X 的值,此时 X 的值是 1->9 矩阵。这仍然是函数内 X 的绑定,即使您更改了与函数外部绑定的值,您使用超赋值 () 更改了这些值。X
X+3
X
<--
1赞
Josh White
11/20/2022
你必须记住,你有两个不同的值绑定到 X:在函数内绑定到 X 的值,以及在全局环境中绑定到函数外部的 X 的值。using only' 更改函数外部的绑定。当您在函数中引用 X 时,它首先查看函数中绑定到 X 的值。<--
1赞
Josh White
11/20/2022
是的,这个解释很好!
评论