3

data.table関数内の操作を含む問題があります。入力引数は、data.table 名と列/変数名です。

コマンドを使用して data.table を参照できますget()。ただし、変数名に同じコマンドを使用してもうまくいきません。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 に答える