许多 R 包允许将表达式作为参数的函数。然而,有些人更进一步。例如,plyr
@hadley 的包大胆地定义了一个名为 的函数.
:
> .
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 必须定义表达式以及延迟和强制评估的所有不同机制,使用.()
何时传递表达式的模式有哪些好处和成本?