何かが足りない場合はご容赦ください...しかし、探しているものの標準list
構文ではありませんか? data.table
より簡潔で明確な私見です。
x[,
list(s = sum(a),
p = prod(a)),
by=id]
# id s p
# 1: 1 25 945
# 2: 2 30 3840
list
これをexpression
and it として構築することもできますeval
。
foo <- expression(list(s=sum(a), p=prod(a)))
x[, eval(foo), by=id]
次に、これを関数に拡張できます (代わりにas.quoted
fromを使用plyr
すると便利です)。
expression_maker <- function(funs, cols, names) {
require(plyr)
list_contents <- paste0(names, '=', funs, '(', cols, ')', collapse=',')
as.quoted(paste('list(', list_contents, ')'))[[1]]
}
output <- expression_maker(funs=c('sum', 'prod'), cols=c('a', 'a'), names=c('s', 'p'))
x[, eval(output), by=id]
...しかし、ドラゴンがいます!
OPの編集ごと:
x[,{s = sum(a); p=prod(a); y = sqrt(abs(s*p)); z = y+1; list(y, z)},by=id]
私は関数でこれを行い、data.table
直接返します:
yourfun <- function(a) {
s <- sum(a)
p <- prod(a)
y <- sqrt(abs(s*p))
z <- y+1
data.table(y, z)
}
x[, yourfun(a), by=id]