С учетом data.table
dat:
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