您可以使用eval(parse(text=myvar)) 或get(myvar),尽管这会将您的分组列分别命名为parse 或get(然后您可以重命名它)。
myvar <- "Petal.Length"
dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3), eval(parse(text=myvar)))]
dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3), get(myvar))]
我不确定如何以您想要的方式保留名称。 (编辑:by=setNames(list(...), c('TrimSpecies', myvar)) - 谢谢@thelatemail!)
编辑 - 出于兴趣,回应下面的一些 cmets。
library(rbenchmark)
benchmark(
eval=dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3), eval(parse(text=myvar)))],
get=dtIris[, list(AvgSepalWidth = mean(Sepal.Width)),
by=list(TrimSpecies = substr(Species,1,3), get(myvar))],
chain=dtIris[, TrimSpecies := substr(Species,1,3)][,list(AvgSepalWidth = mean(Sepal.Width)),by=c("TrimSpecies",myvar)][,TrimSpecies:=NULL][]
)
test replications elapsed relative user.self sys.self user.child sys.child
3 chain 100 0.151 1.987 0.250 0 0 0
1 eval 100 0.079 1.039 0.097 0 0 0
2 get 100 0.076 1.000 0.094 0 0 0
get 比 eval(parse(text=..))) 快,后者比定义 TrimSpecies 快,使用 by 的字符形式然后将其删除(链接 dts)。