【发布时间】:2012-12-23 03:02:17
【问题描述】:
许多 R 包允许将表达式作为参数的函数。然而,有些人更进一步。比如@hadley 的plyr 包就大胆地定义了一个名为. 的函数:
> .
function (..., .env = parent.frame())
{
structure(as.list(match.call()[-1]), env = .env, class = "quoted")
}
<environment: namespace:plyr>
在我的环境中,?'.' 产生“在任何包中都找不到主题的帮助”。从表面上看,.() 提供了一种自动捕捉周围环境的延迟评估机制:
> x <- c(1,2,3)
> dot <- .(x + 10)
> dot
List of 1
$ x + 10: language x + 10
- attr(*, "env")=<environment: R_GlobalEnv>
- attr(*, "class")= chr "quoted"
> dot[[1]]
x + 10
> eval(dot[[1]])
[1] 11 12 13
就是这样吗?我了解env 属性的用途,但为什么class = "quoted" 很重要?
由于 R 必须定义表达式以及延迟和强制评估的所有不同机制,在传递表达式时使用 .() 模式有哪些好处和成本?
【问题讨论】:
-
好像答案在
?'.'的Details部分 -
@MatthewLundberg 当我这样做时,我得到“没有找到任何包中的主题的帮助”,这就是我发布这个问题的原因。因为我可以看到其他
plyr函数的帮助,所以我认为这个函数没有记录,但是在查阅了软件包的 PDF 文档后,这一切都说得通。由于其他人可能会在 R 中遇到此文档问题,因此如果您发布您的建议或引用文档作为答案,我将接受它。
标签: r lambda closures plyr delayed-execution