【问题标题】:Patterns for expression passing in R在 R 中传递表达式的模式
【发布时间】: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


【解决方案1】:

来自?'.'

详情

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2021-10-08
    • 1970-01-01
    • 2011-06-09
    • 2014-12-10
    • 2018-11-10
    • 2017-10-16
    相关资源
    最近更新 更多