in 中的某些函数R
能够将 adata.frame
作为参数,同时具有可以使用 thenames
的单独参数data.frame
(无需将它们作为字符串引用)。
一个具体的例子是包中的qplot
函数ggplot2
:
myDF <- data.frame(values=rnorm(5*2), group=c(rep("A", 5), rep("B", 5)))
qplot(values, data=myDF, colour=group, geom="density")
qplot
能够接受values
并且group
知道它们是 的列myDF
。
现在,如果我想编写一个在绘图之前进行一些预处理的包装函数,我将失去该功能:
# A silly example. But lets assume our dataframe has more than 1 group column
silly.wrapper <- function(dataframe, colour) {
dataframe$values <- dataframe$values*2
qplot(values*2, data=dataframe, geom="density", colour=colour)
}
现在,如果我尝试调用silly.wrapper
并给它colour=group
它会引发一个错误,即对象组尚未声明(如您所料):
# We have to call print because its a lattice plot so returned qplot won't render
# otherwise. Removing call to print still results in the same error.
print(silly.wrapper(myDF, colour=group))
Error in eval(expr, envir, enclos) : object 'group' not found
In addition: Warning message:
In eval(expr, envir, enclos) : restarting interrupted promise evaluation
我也尝试过使用...
:
silly.wrapper <- function(dataframe, ...) {
dataframe$values <- dataframe$values*2
qplot(values*2, data=dataframe, geom="density", ...)
}
但得到相同的错误信息。
这让我想到了一个更普遍的问题:如何编写一个函数,比如qplot
,直到稍后才检查对象的存在,即将它作为数据帧的列访问?