在R中自定义函数中将参数传递到data.table的简单可重现示例

Mia*_*Cai 4 r function data.table

我已经搜寻了这个答案几个小时。很多人都问过类似的问题,但是我没有找到一个足够简单的问题或一个简单的答案。这是我的方法:

假设我想在中进行一个简单的分组data.table

library(data.table)
mtcars = data.table(mtcars)
mtcars[,sum(mpg), gear]

# Here are the results
#   gear    V1
#1:    4 294.4
#2:    3 241.6
#3:    5 106.9
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用自定义函数执行此操作:

zz = function(data, var, group){
  return(data[,sum(var), group])
}
zz(mtcars, mpg, gear)
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

eval(bysub,parent.frame(),parent.frame())中的错误:找不到对象“齿轮”

我试过substituteevalquote,和其他解决方案,但没有人的作品。我想知道是否有人可以对此提供更直接的解决方案和解释。

谢谢,万圣节快乐!

akr*_*run 5

如果我们使用不带引号的参数,substituteeval审视你们

zz <- function(data, var, group){
 var <- substitute(var)
 group <- substitute(group)
 setnames(data[, sum(eval(var)), by = group],
        c(deparse(group), deparse(var)))[]
 # or use
 #  setnames(data[, sum(eval(var)), by = c(deparse(group))], 2, deparse(var))[]

}
zz(mtcars, mpg, gear)
#   gear   mpg
#1:    4 294.4
#2:    3 241.6
#3:    5 106.9
Run Code Online (Sandbox Code Playgroud)


Col*_*ole 5

虽然并不完美,但这个...论点可能会有所帮助:

zz = function(dt, ...){
  return(dt[...])
}

zz(mtcars, , sum(mpg), gear)

   gear    V1
1:    4 294.4
2:    3 241.6
3:    5 106.9
Run Code Online (Sandbox Code Playgroud)