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
}