gpt4 book ai didi

r - 为什么 'with' 不通过嵌套函数传递变量范围?

转载 作者:行者123 更新时间:2023-12-04 17:09:26 24 4
gpt4 key购买 nike

在 R 中,如果我创建一个环境然后使用 with要在该环境中评估函数,该函数通常可以访问变量。但是,如果我嵌套函数,出于某种原因,它们会超出范围。你能向我解释为什么会这样吗?

例子:

使用名为 x 的变量创建一个新环境

E = new.env();
E$x = c(1,2,3)

使用 with我可以打印这个变量:
with(E, print(x));
#[1] 1 2 3

但是现在如果我嵌套这个函数,它就不再起作用了:
printMe = function() { print(x); }
with(E, printMe())
#Error in print(x) : object 'x' not found

我知道我可以让它再次像这样工作:
printMe = function(x) { print(x); }
with(E, printMe(x))
#[1] 1 2 3

但我不明白 -- 如果 with创建环境,为什么嵌套函数看不到 x ?如果您附加它,它会起作用:
attach(E)
printMe()
#[1] 1 2 3

我想我只是错过了一些关于范围界定的东西,但是推荐的方法是什么?或者,用另一种方式提出我的问题:为什么 with 中不能嵌套函数?访问自由变量?

最佳答案

基本上,当您使用 with , 你做的和

printMe = function() { print(x); }
local({
x=1:3
printMe()
})
# Error in print(x) : object 'x' not found

这也不起作用。这与如何在函数中解析自由变量有关。当您调用 printMe ,它将寻找在外壳本身中解析变量,然后它在定义函数的父框架中寻找(它不寻找函数被调用的位置)。在这里, printMe是在全局环境中定义的。但是, x没有在全局环境中定义。如果你这样做
printMe = function() { print(x); }
x=1:3
printMe()
# [1] 1 2 3

然后两个 xprintMe在全局环境中定义,因此它可以工作。您还可以更改 printMe 的环境功能
 environment(printMe) <- E
printMe()
# [1] 1 2 3

或在与 with 相同的环境中定义函数
with(E,{printMe <- function() {print(x)}; printMe()})
# [1] 1 2 3

要点是,从什么环境中调用函数并不重要,重要的是它们是在什么环境中定义的。

您可能想查看 Advanced R有关这些属性的函数式编程的 Material 。

关于r - 为什么 'with' 不通过嵌套函数传递变量范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25997339/

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