鉴于data.table
数据:
dat <- data.table(x_one=1:10, x_two=1:10, y_one=1:10, y_two=1:10)
我想要一个在给定“根”名称的情况下在两个相似行之间创建表达式的函数,例如x_one - x_two
.
myfun <- function(name) {
one <- paste0(name, '_one')
two <- paste0(name, '_two')
parse(text=paste(one, '-', two))
}
现在,只使用一个根名称可以按预期工作,并产生一个向量。
dat[, eval(myfun('x')),]
[1] 0 0 0 0 0 0 0 0 0 0
但是,尝试使用该list
技术为该输出分配名称失败:
dat[, list(x_out = eval(myfun('x'))),]
Error in eval(expr, envir, enclos) : object 'x_one' not found
我可以通过添加一个来“解决”这个问题,with(dat, ...)
但这似乎几乎没有 data.table-ish
dat[, list(x_out = with(dat, eval(myfun('x'))),
y_out = with(dat, eval(myfun('y')))),]
x_out y_out
1: 0 0
2: 0 0
3: 0 0
4: 0 0
5: 0 0
6: 0 0
7: 0 0
8: 0 0
9: 0 0
10: 0 0
如果我想要像上面那样的输出,生成和评估这些表达式的正确方法是什么?
如果有帮助,sessionInfo()
输出如下。我记得能够做到这一点,或者接近它的东西,但它已经有一段时间了,并且data.table
已经更新了......
R version 2.15.1 (2012-06-22)
Platform: x86_64-pc-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] graphics grDevices utils datasets stats grid methods base
other attached packages:
[1] Cairo_1.5-1 zoo_1.7-7 stringr_0.6.1 doMC_1.2.5 multicore_0.1-7 iterators_1.0.6 foreach_1.4.0
[8] data.table_1.8.2 circular_0.4-3 boot_1.3-5 ggplot2_0.9.1 reshape2_1.2.1 plyr_1.7.1
loaded via a namespace (and not attached):
[1] codetools_0.2-8 colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2 labeling_0.1 lattice_0.20-6
[7] MASS_7.3-20 memoise_0.1 munsell_0.3 proto_0.3-9.2 RColorBrewer_1.0-5 scales_0.2.1
[13] tools_2.15.1