在R中传递表达式的模式

在R中传递表达式的模式,r,lambda,closures,plyr,delayed-execution,R,Lambda,Closures,Plyr,Delayed Execution,许多R包允许函数将表达式作为参数。然而,有些人更进一步。例如,@hadley编写的plyr包大胆地定义了一个名为的函数: > . function (..., .env = parent.frame()) { structure(as.list(match.call()[-1]), env = .env, class = "quoted") } <environment: namespace:plyr> 就这么回事吗?我理解env属性的用途,但为什么class=“q

许多R包允许函数将表达式作为参数。然而,有些人更进一步。例如,@hadley编写的
plyr
包大胆地定义了一个名为
的函数:

> .
function (..., .env = parent.frame()) 
{
    structure(as.list(match.call()[-1]), env = .env, class = "quoted")
}
<environment: namespace:plyr>
就这么回事吗?我理解
env
属性的用途,但为什么
class=“quoted”
很重要

由于R必须定义表达式以及延迟和强制求值,因此在传递表达式时使用
()
模式有哪些好处和成本?

来自
?'。

细节

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

From
?'。

细节


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

答案似乎在
?'的
详细信息部分。
@MatthewLundberg我得到了“在任何包中都找不到主题的帮助”当我这样做的时候,这就是为什么我发布了这个问题。由于我可以看到其他
plyr
函数的帮助,我认为这是一个没有文档记录的函数,但是在查阅了PDF文档后,这一切都是有意义的。由于其他人可能会在R中遇到此文档问题,如果您发布您的建议或引用此文档作为答案,我将接受。答案似乎位于
?”的
详细信息部分。
@MatthewLundberg我这样做时“在任何包中都找不到主题的帮助”,这就是我发布此问题的原因。由于我可以看到其他
plyr
函数的帮助,我认为这是一个没有文档记录的函数,但是在查阅了PDF文档后,这一切都是有意义的。由于其他人可能在R中遇到此文档问题,如果您发布您的建议或引用文档作为答案,我将接受。
> 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