为了澄清,我并不是说R存在问题。问题可能就在我这一边,但我真的很困惑。我有一个创建函数make_a()
的函数(a()
)。我还有一个函数在其定义(fun_using_a()
中使用此函数:
make_a <- function(x) {
a <- function(y) {
x + y
}
a
}
fun_using_a <- function(x) {
a(x)/2
}
现在,我创建另一个使用这两个功能的函数:
my_fun <- function(x) {
a <- make_a(1)
fun_using_a(x)
}
呼叫my_fun(10)
会导致错误:
my_fun(10)
a(x)中的错误:找不到函数“ a”
但是,如果在全局环境中做基本上相同的事情,那么一切都会很好:
a <- make_a(1)
fun_using_a(10)
[1] 5.5
这是怎么回事?为什么my_fun(10)
会引发错误?看来我对R环境的理解一定有点离谱,但是我无法弄清楚。当我调用my_fun()
时,是否应该在第一行之后的执行环境中定义函数a()
,因此fun_using_a()
应该能够在其中找到它(由于延迟求值)?
任何帮助将不胜感激。非常感谢!
答案 0 :(得分:1)
您需要将make_a
的结果a
保存在fun_using_a
可以看到的地方。没有一个“执行环境”,每个函数调用都会创建一个新的环境。如前所述,make_a
返回一个函数,但是直到第二版代码,您都没有显示它可以保存在任何地方。
顺便说一句,make_a
可能会有一个细微的错误:由于x
直到第一次调用a()
时才被评估,因此其值可能会改变。例如,
x <- 1
a <- make_a(x)
x <- 5
fun_using_a(10)
将返回7.5,而不是5.5,因为x
中a(y)
的值将为5而不是1。要解决此问题,请强制{{1}中的x
的值}:
make_a