0

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,直到稍后才检查对象的存在,即将它作为数据帧的列访问?

4

0 回答 0