R 中的环境问题
Environment issues in R
澄清一下,我并不是说 R 有问题。问题可能在我这边,但我真的很困惑。我有一个创建函数 a()
的函数 (make_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()
应该能够在那里找到它(由于懒惰评估)?
任何帮助将不胜感激。非常感谢!
您需要将 make_a
的结果以名称 a
保存在 fun_using_a
可以看到的地方。没有一个 "execution environment",每个函数调用都会创建一个新函数。正如发布的那样,make_a
return 是一个函数,但在您的第二个版本的代码之前,您没有显示它被保存在任何地方。
顺便说一句,make_a
可能有一个微妙的错误:因为 x
在第一次调用 a()
之前从未被计算过,它的值可能会改变。例如,
x <- 1
a <- make_a(x)
x <- 5
fun_using_a(10)
将 return 7.5,而不是 5.5,因为 a(y)
中 x
的值将是 5 而不是 1。要修复它,强制 [=17= 的值] 在 make_a
:
make_a_2 <- function(x) {
force(x)
a <- function(y) {
x + y
}
a
}
澄清一下,我并不是说 R 有问题。问题可能在我这边,但我真的很困惑。我有一个创建函数 a()
的函数 (make_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()
应该能够在那里找到它(由于懒惰评估)?
任何帮助将不胜感激。非常感谢!
您需要将 make_a
的结果以名称 a
保存在 fun_using_a
可以看到的地方。没有一个 "execution environment",每个函数调用都会创建一个新函数。正如发布的那样,make_a
return 是一个函数,但在您的第二个版本的代码之前,您没有显示它被保存在任何地方。
顺便说一句,make_a
可能有一个微妙的错误:因为 x
在第一次调用 a()
之前从未被计算过,它的值可能会改变。例如,
x <- 1
a <- make_a(x)
x <- 5
fun_using_a(10)
将 return 7.5,而不是 5.5,因为 a(y)
中 x
的值将是 5 而不是 1。要修复它,强制 [=17= 的值] 在 make_a
:
make_a_2 <- function(x) {
force(x)
a <- function(y) {
x + y
}
a
}