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

Jor*_*eys 14 environment r function scoping

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

伪代码中的经典模式:

ff <- function(x){
    y <- some_value
    some_function(y)
}
ff(x)
Run Code Online (Sandbox Code Playgroud)

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

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

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

其中一些问题:

PS:我知道R-devel列表,万一你想知道......

had*_*ley 5

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

另请参见:标准的非标准评估规则.


Ric*_*ton 3

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

y <- eval(substitute(y), data)
Run Code Online (Sandbox Code Playgroud)

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