Data.table和get()命令(R)

Data.table和get()命令(R),r,function,data.table,R,Function,Data.table,在函数中包含data.table操作时出现问题。输入参数是data.table名称和列/变量名称 我可以使用get()命令来引用data.table。但是,对变量名使用相同的命令是行不通的。我知道get()在列/变量名的情况下可能不合适,但我一直在考虑使用哪个命令 编辑:我现在加入了substitute()而不是get(),但仍然不起作用 toy_example_fun <- function(d, .expr){ .expr = substitute(.expr) setke

在函数中包含
data.table
操作时出现问题。输入参数是data.table名称和列/变量名称

我可以使用
get()
命令来引用data.table。但是,对变量名使用相同的命令是行不通的。我知道
get()
在列/变量名的情况下可能不合适,但我一直在考虑使用哪个命令

编辑:我现在加入了
substitute()
而不是
get()
,但仍然不起作用

toy_example_fun <- function(d, .expr){

  .expr = substitute(.expr)

  setkey(get(d), .expr)  # ==> doesn't work

  d.agg <- get(d)[,list(sum(y), sum(v)), by=.expr]  # --> works
}

toy_example_fun("DT", x)
尽管如此,后一种选择仍然有效
variable,您可以这样做:

someFun <- function(d, .expr){
  group <- substitute(.expr)
  get(d)[,list(sum(y), sum(v)), by=group]
}

someFun("DT", x)
   group V1 V2
1:     a 10  6
2:     b 10 15
3:     c 10 24


someFun("DT", "x")
   x V1 V2
1: a 10  6
2: b 10 15
3: c 10 24
但是
一些有趣的事情(“DT”,x)
就行不通了。所以阿德里的回答更一般


使用
setkeyv

someFun <- function(d, cols){
  setkeyv(get(d), cols)
  cols <- substitute(cols)
  get(d)[,list(sum(y), sum(v)), by=cols]
}

someFun("DT", "x")
   x V1 V2
1: a 10  6
2: b 10 15
3: c 10 24

一些有趣的重复,谢谢你让我参考你的帖子,安德里。但是,如果我使用
substitute()
,它仍然无法工作。请在链接问题的答案中加入建议来编辑您的问题-否则您可能会将其作为副本关闭。完成。再次感谢您的评论。这仍然是重复的。您应该使用链接答案中解释的
quote(x)
。谢谢,Andrie和Matthew。你的回答对我帮助很大。但是,在最后一个函数中,我还需要使用
setkey()
命令。当另一部分工作时,
setkey(get(d),.expr)
行仍然不工作。事实上,这就是我困惑的原因(我从来没有看过聚合,因为我首先从
setkey()
中得到了错误。)@majom Try
?setkeyv
(末尾额外的v)。这太完美了。非常感谢!我真的很感谢你的帮助。完成了。谢谢你的提示,谢谢你开发了这么棒的软件包!
someFun <- function(d, .expr){
  group <- substitute(.expr)
  get(d)[,list(sum(y), sum(v)), by=group]
}

someFun("DT", x)
   group V1 V2
1:     a 10  6
2:     b 10 15
3:     c 10 24


someFun("DT", "x")
   x V1 V2
1: a 10  6
2: b 10 15
3: c 10 24
someFun = function(d, col) {
    get(d)[,list(sum(y),sum(v)),by=col]
}
someFun("DT","x")
   x V1 V2
1: a 10  6
2: b 10 15
3: c 10 24
someFun("DT","x,y")
   x y V1 V2
1: a 1  1  1
2: a 3  3  2
3: a 6  6  3
4: b 1  1  4
5: b 3  3  5
6: b 6  6  6
7: c 1  1  7
8: c 3  3  8
9: c 6  6  9
someFun <- function(d, cols){
  setkeyv(get(d), cols)
  cols <- substitute(cols)
  get(d)[,list(sum(y), sum(v)), by=cols]
}

someFun("DT", "x")
   x V1 V2
1: a 10  6
2: b 10 15
3: c 10 24