【发布时间】:2013-02-23 10:42:53
【问题描述】:
我创建了以下函数/示例作为在表格等中显示变量标签的通用方式:
#' Function to prettify the output of another function using a `var.labels` attribute
#' This is particularly useful in combination with read.dta et al.
#' @param dat A data.frame with attr `var.labels` giving descriptions of variables
#' @param expr An expression to evaluate with pretty var.labels
#' @return The result of the expression, with variable names replaced with their labels
#' @examples
#' testDF <- data.frame( a=seq(10),b=runif(10),c=rnorm(10) )
#' attr(testDF,"var.labels") <- c("Identifier","Important Data","Lies, Damn Lies, Statistics")
#' prettify( testDF, quote(str(dat)) )
prettify <- function( dat, expr ) {
labels <- attr(dat,"var.labels")
for(i in seq(ncol(dat))) colnames(dat)[i] <- labels[i]
attr(dat,"var.labels") <- NULL
eval( expr )
}
不过,我希望用户不必引用传入的表达式。
replicate 就是这样做的,使用以下代码:
eval.parent(substitute(function(...) expr))
但我不明白它是如何工作的,而且就像在没有理解的情况下尝试复制的典型情况一样,我试图简单地复制此代码或修改它的尝试都失败了。
如何在不要求用户quote 他们的表达式的情况下编写一个以未计算表达式作为输入的函数?我认为答案将在很大程度上依赖于惰性评估。
【问题讨论】:
-
关于
replicate的作用,我没有测试任何东西,但我认为function(...)是一种将任何附加参数传递给表达式的方法,eval.parent在父级中对其进行评估环境,而不是功能环境。这可能是它在您的情况下不起作用的原因,因为dat不在父环境中。 -
另外,在建议的编辑中,@user2103369 建议
replicate不同,因为它使用sapply来获得多个评估,因此它需要一个函数而不是调用。
标签: r lazy-evaluation