создать выражение из функции для data.table для eval

Учитывая 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      
23
задан Justin 8 August 2012 в 20:40
поделиться