2016-09-08 2 views
0

Я потерян при оценке by в data.table. Что будет правильным способом объединить функции LJ и LJ2 в одну функцию?Нестандартная оценка in in data.table

LJ <- function(dt_x_, dt_y_, by_) 
{ 
    merge(
     dt_x_, 
     dt_y_, 
     by = eval(substitute(by_)), all.x = TRUE, sort = FALSE) 
} 
LJ2 <- function(dt_x_, dt_y_, by_) 
{ 
    merge(
     dt_x_, 
     dt_y_, 
     by = deparse(substitute(by_)), all.x = TRUE, sort = FALSE) 
} 
LJ(
    data.table(A = c(1,2,3)), 
    data.table(A = c(1,2,3), B = c(11,12,13)), 
    "A") 
LJ2(
    data.table(A = c(1,2,3)), 
    data.table(A = c(1,2,3), B = c(11,12,13)), 
    A) 
+0

я получаю выход же обе функции. Неясно, что вы намереваетесь – akrun

+0

это не связано с data.table, 'merge.data.frame' будет вести себя одинаково – jangorecki

ответ

3

Я считаю это плохой идеей. Всегда ли пользователь передает значение символа. Вы можете сделать это:

LJ3 <- function(dt_x_, dt_y_, by_) 
{ 
    by_ <- gsub('\"', "", deparse(substitute(by_)), fixed = TRUE) 
    dt_y_[dt_x_, on = by_] 
} 

LJ3(
    data.table(A = c(4,1,2,3)), 
    data.table(A = c(1,2,3), B = c(11,12,13)), 
    A) 
# A B 
#1: 4 NA 
#2: 1 11 
#3: 2 12 
#4: 3 13 

LJ3(
    data.table(A = c(4,1,2,3)), 
    data.table(A = c(1,2,3), B = c(11,12,13)), 
    "A") 
# A B 
#1: 4 NA 
#2: 1 11 
#3: 2 12 
#4: 3 13 

Этот вопрос не связан с data.table. Параметр by в merge.data.table всегда ожидает значение символа, как и on.

Edit: @eddi указывает на то, что выше, будет ошибкой, если имена столбцов с фактическим " в них (то, что вы должны избегать в целом, но может случиться, если вы fread некоторые входные файлы, подготовленные другими).

Альтернативы, которая может обрабатывать такие крайние случаи будет:

LJ4 <- function(dt_x_, dt_y_, by_) 
{ 
    by_ <- substitute(by_) 
    if (!is.character(by_)) by_ <- deparse(by_) 
    dt_y_[dt_x_, on = by_] 
} 
+1

Fyi,' on' принимает '.()' -style args в версии devel, частично я думаю, чтобы упростить объединение без эквинов. Пункты 32 и 33 в новостях 1.9.7: https://github.com/Rdatatable/data.table/blob/master/NEWS.md – Frank

+1

Спасибо за хедз-ап. Когда я отвечаю, я всегда говорю о версии CRAN. Мне нужна несколько стабильная версия, поэтому я даже не устанавливаю версии, если мне не нужно проверять что-то для будущей совместимости. – Roland

+3

Этот подход 'gsub' завершится неудачно, если в названии столбца есть кавычки. Я бы просто проверить, является ли 'substitute (by_)' символом, и только отменить, если это не так. – eddi

Смежные вопросы