问题1:为什么它不一致?data.table by替代,eval和deparse
dt <- data.table(x=1:4, y=c(1,1,2,2), z=c(1,2,1,2))
test1 <- function(dt, a){
t <- deparse(substitute(a))
dt[,list(x=sum(x)), by=t]
}
test1(dt, y) # Works well
y x
1: 1 3
2: 2 7
test2 <- function(dt, a){
dt[,list(x=sum(x)), by=deparse(substitute(a))]
}
test2(dt, y)
# Error: 'by' appears to evaluate to column names but isn't c() or key().
问题2:
看来我可以做两个框架下?这是为什么?我应该使用哪一个?
test1 <- function(dt, a){
dt[,list(x=sum(x)), by=eval(substitute(a))]
}
test1(dt, y)
substitute x
1: 1 3
2: 2 7
>
test2 <- function(dt, a){
dt[,list(x=sum(x)), by=eval(substitute(a), parent.frame())]
}
test2(dt, y)
substitute x
1: 1 3
2: 2 7
对于(1),我认为错误信息非常清晰(您只粘贴了信息的前半部分)。剩下的就是:“如果可以,使用'by = list(...)'否则,'by = eval(deparse(substitute(y)))'应该起作用。可以检测到需要哪些列“。 (2)看看''eval'(正如我在你的其他文章中回答的那样)。 – Arun
@Arun使用不同的框架评估默认显式参数https://stat.ethz.ch/pipermail/r-help/2010-February/227582.html – colinfang