R中的环境问题

时间:2018-12-02 05:14:02

标签: r environment

为了澄清,我并不是说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()应该能够在其中找到它(由于延迟求值)?

任何帮助将不胜感激。非常感谢!

1 个答案:

答案 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,因为xa(y)的值将为5而不是1。要解决此问题,请强制{{1}中的x的值}:

make_a