7

これはバグかもしれません。その場合は、この質問を削除し、バグとして報告します。開発者の時間を無駄にしないように、何か間違ったことをしていないことを確認するために誰かに見てもらいたいです。

test = data.table(mo=1:100, b=100:1, key=c("mo", "b"))
mo = 1
test[J(mo)]

これは、testによって返される正しい結果ではなく、data.table全体を返します。

test[J(1)]

エラーはtest、結合されているテーブルと同じ列名を持つことが原因である可能性があると思いますmo。他の誰かが同じ問題を抱えていますか?

4

2 に答える 2

9

data.table-faq 2.13これは、 (警告、pdf) で説明されているものと同様のスコープの問題です。testという名前の列が含まれているためmo、が評価されると、マスクされたグローバル環境で見つかった のJ(mo)値ではなく、その列全体が返されます。mo(もちろん、このスコープ動作は、次のようなことをしたい場合に非常に便利ですtest[mo<4]!)

これを試して、何が起こっているかを確認してください。

test <- data.table(mo=1:5, b=5:1, key=c("mo", "b"))
mo <-  1
test[browser()]
Browse[1]> J(mo)
#    mo
# 1:  1
# 2:  2
# 3:  3
# 4:  4
# 5:  5
# Browse[1]> 

リンクされた FAQ で提案されているように、簡単な解決策は、インデックス変数の名前を変更することです。

MO <- 1
test[J(MO)]
#    mo b
# 1:  1 6

( のドキュメントで説明されている理由により、これも機能しますi) ?data.table:

mo <- data.table(1)
test[mo]
#    mo b
# 1:  1 6
于 2013-01-08T16:42:14.477 に答える
4

これはバグではありませんが、文書化された動作が確認されています。それはスコープの問題です:

test[J(globalenv()$mo)]
   mo   b
1:  1 100
于 2013-01-08T16:35:31.117 に答える