14

这个问题来自一系列其他问题,这些问题基本上都处理相同的问题。出于某种奇怪的原因,在另一个函数中使用一个函数有时会失败,因为在第一个函数的本地环境中定义的变量在第二个函数中找不到。

伪代码中的经典模式:

ff <- function(x){
    y <- some_value
    some_function(y)
}
ff(x)

eval(expr,envir,enclos)中的错误:找不到对象'y'

首先,我认为它与 S4 方法和其中的范围有关,但它也与其他函数有关。我与 R 开发团队进行了一些互动,但他们所做的只是将我引导到错误报告网站(我不得不说,这不是最吸引人的网站)。我从来没有得到任何反馈。

随着问题不断出现,我想知道是否有逻辑解释。在所有这些情况下,这是一个常见的错误吗?如果是,是哪一个?或者它真的是一个错误?

其中一些问题:

PS:我知道 R-devel 列表,以防你想知道......

4

4 回答 4

5

R 既有词法作用域,也有动态作用域。词法作用域自动工作,但动态作用域必须手动实现,并且需要仔细记账。只有交互式地用于数据分析的函数才需要动态范围,所以大多数作者(比如我!)不知道如何正确地做到这一点。

另见:标准非标准评估规则

于 2010-10-01T19:50:58.387 回答
4

R 中无疑存在错误,但人们遇到的许多问题通常是在实现中的错误some_function,而不是 R 本身。R 具有范围规则(请参阅http://cran.r-project.org/doc/manuals/R-intro.html#Scope),当与函数参数的惰性求值和eval在其他范围内参数的能力相结合时,它非常强大但这也常常导致细微的错误。

于 2010-10-01T17:29:17.540 回答
3

正如 Dirk 在他的回答中提到的那样,您发布的代码实际上没有问题。在您在问题中发布的链接中,似乎有一个共同的主题:some_function包含以某种方式与环境混淆的代码。这种混乱是显式的,使用new.envwith或隐式的,使用一个data参数,可能有这样一行

y <- eval(substitute(y), data)

这个故事的寓意是双重的。首先,尽量避免显式操作环境,除非你真的确定自己知道自己在做什么。其次,如果一个函数有一个数据参数,那么将你需要该函数使用的所有变量放在该数据框中。

于 2010-10-04T12:48:45.630 回答
0

好吧,您发布的内容没有问题:

/tmp$ cat joris.r 
#!/usr/bin/r -t

some_function <- function(y) y^2

ff <- function(x){
    y <- 4
    some_function(y)  # so we expect 16
}
print(ff(3))          # 3 is ignored
$ ./joris.r 
[1] 16
/tmp$

您能否重述并发布实际的错误或错误功能?

于 2010-10-01T17:32:29.233 回答