R 2.11.1中的范围和功能:出了什么问题?

时间:2010-10-01 15:43:32

标签: r function environment scoping

这个问题来自一系列其他问题,这些问题都涉及到同样的问题。出于某些奇怪的原因,在第二个函数中找不到第一个函数的局部环境中定义的变量的意义上,在另一个函数中使用函数有时会失败。

伪代码中的经典模式:

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

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

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

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

其中一些问题:

PS:我知道R-devel列表,如果你想知道......

4 个答案:

答案 0 :(得分:5)

R具有词汇和动态范围。词法范围自动运行,但动态范围必须手动实现,并且需要仔细记账。只有交互式地用于数据分析的函数需要动态范围,所以大多数作者(像我一样!)都没有学会如何正确地进行。

另见:standard non-standard evaluation rules

答案 1 :(得分:4)

R中无疑存在漏洞,但人们所遇到的很多问题往往是some_function的实现错误,而不是R本身。 R具有作用域规则(参见http://cran.r-project.org/doc/manuals/R-intro.html#Scope),当与函数参数的惰性求值结合使用时,其他作用域中eval参数的能力非常强大,但也经常导致细微的错误。

答案 2 :(得分:3)

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

{{1}}

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

答案 3 :(得分: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$

你可以重申和发布实际的错误或错误吗?