繁体   English   中英

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

[英]Scoping and functions in R 2.11.1 : What's going wrong?

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

伪代码中的经典模式:

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

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

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

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

其中一些问题:

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

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

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

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

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

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

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

那么你发布的内容没有问题

/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$

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM