与えられたdata.table
データ:
dat <- data.table(x_one=1:10, x_two=1:10, y_one=1:10, y_two=1:10)
「ルート」名を付けて、2つの同じような行の間に式を作成する関数が必要x_one - x_two
です。
myfun <- function(name) {
one <- paste0(name, '_one')
two <- paste0(name, '_two')
parse(text=paste(one, '-', two))
}
これで、ルート名を1つだけ使用すると期待どおりに機能し、結果としてベクトルになります。
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っぽいようには見えません。
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