1

许多 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 必须定义表达式以及延迟和强制评估的所有不同机制,使用.()何时传递表达式的模式有哪些好处和成本?

4

1 回答 1

1

?'.'

细节

类似的技巧可以用替代来执行,但是当函数可以以多种方式调用时,确保从正确的帧中提取值变得越来越棘手。替代技巧也使针对使用它们的函数进行编程变得困难,而引用类提供 as.quoted.character 以将字符串转换为适当的数据结构。

于 2012-12-23T04:53:14.207 回答