2016-09-08 8 views
0

の評価がdata.tableで失われています。 LJLJ2の機能を1つの関数にマージする正しい方法は何ですか?by 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とは関係ありません。 merge.data.tablebyパラメータには、常にonのように文字値が必要です。

編集:上記のあなたは、列の名前を持っている場合は、それらの実際の"で(あなたは、一般的に避けなければならない何かを、あなたfread、いくつかの入力ファイルは、他の人が作成した場合に発生する可能性が)失敗することを指摘し@eddi。そのようなエッジケースを扱うことができる

選択肢は次のようになります。

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'は 'devel 'バージョンの'。非等価結合をより簡単にするために、私は推測します。 1.9.7のニュースのアイテム32&33:https://github.com/Rdatatable/data.table/blob/master/NEWS.md – Frank

+1

ヘッドアップありがとう。私はいつも答えるときにCRANバージョンを参照します。将来互換性のために何かをテストする必要がなければ、私は少し安定したバージョンが必要なので、develバージョンをインストールすることさえしません。 – Roland

+3

カラム名に実際に引用符がある場合、この 'gsub'アプローチは失敗します。私は単に 'substitute(by_)'が文字かどうかをチェックし、そうでなければdeparseだけを調べます。 – eddi

関連する問題