3

我有一个问题,包括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)

替代方案: quote() -> 这行得通。但是,我对在函数内部工作的解决方案感兴趣。

DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)    
d <- "DT"
variable <- quote(x)
d.agg <- get(d)[,list(sum(y), sum(v)), by=variable]  

尽管如此,后一种替代方法variable <- quote(x)会产生错误消息:

  <simpleError in doTryCatch(return(expr), name, parentenv, handler): object 'x' not found>
    <simpleError in is.scalar(val): object 'x' not found>
    <simpleError in is.data.frame(obj): object 'x' not found> 

谢谢你的帮助。

4

1 回答 1

3

干得好:

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

马修编辑:

+1 以上。和/或字符列名也可以by直接接受:

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("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
于 2012-08-08T08:58:38.377 回答