该包data.table
有一些特殊的语法,需要使用表达式作为i
andj
参数。
这对于如何编写接受参数并将参数传递给数据表的函数有一些影响,正如常见问题解答的第 1.16 节中所解释的那样。
但我不知道如何提高这一水平。
这是一个例子。假设我想编写一个包装器函数foo()
来对我的数据进行特定的汇总,然后再编写一个包装器plotfoo()
来调用foo()
并绘制结果:
library(data.table)
foo <- function(data, by){
by <- substitute(by)
data[, .N, by=list(eval(by))]
}
DT <- data.table(mtcars)
foo(DT, gear)
好的,这行得通,因为我得到了表格结果:
by N
1: 4 12
2: 3 15
3: 5 5
现在,我在写作时尝试相同,plotfoo()
但我失败了:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, eval(by))
}
plotfoo(DT, gear)
但是这次我收到一条错误消息:
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
好的,所以eval()
导致问题。让我们删除它:
plotfoo <- function(data, by){
by <- substitute(by)
foo(data, by)
}
plotfoo(DT, gear)
哦,不,我收到一条新的错误消息:
Error in `[.data.table`(data, , .N, by = list(eval(by))) :
column or expression 1 of 'by' or 'keyby' is type symbol. Do not quote column names. Useage: DT[,sum(colC),by=list(colA,month(colB))]
这就是我仍然卡住的地方。
问题:如何编写一个调用data.table的函数的函数?