Учитывая 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