2013-01-08 7 views
7

これはバグかもしれません。その場合、私はこの質問を削除し、バグとして報告します。私は誰かが私が間違って何かをしていないことを確認するために見てほしいので、私は開発者の時間を無駄にしない。私はエラーが接合されているテーブルと同じ列名を有するtestから来るかもしれないと信じfast join data.table(潜在的なバグ、報告前のチェック)

test[J(1)] 

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

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

by、mo。他の誰かが同じ問題を抱えていますか?

+1

私はこの動作を説明できませんが、fwiw: 'foo = 1; test [J(foo)] 'は期待通りの結果を出しました。これは 'test [mo]'と 'mo = data.table(1);でも同じです。テスト[mo]。 – Justin

+0

また、 'same(test [J(1)]、test [J(mo < - 1)]'は 'TRUE'を返します。 – Ryogi

答えて

9

これはdata.table-faq 2.13 (warning, pdf)で説明したのと同様のスコープの問題、である:それはスコープの問題です。 testにはmoという名前の列が含まれているため、J(mo)を評価すると、マスクするグローバル環境で見つかったmoの値ではなく、その列全体が返されます。リンクFAQで示唆したように

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]> 

:(!このスコープの挙動はもちろん、素敵かなりあなたがtest[mo<4]のような何かをしたいです)

は何が起こっているのを参照してくださいにこれを試してみてくださいのドキュメントで説明する理由のために、

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

(これも動作します:、簡単な解決策は、インデックス変数の名前を変更することですin ?data.table):

mo <- data.table(1) 
test[mo] 
# mo b 
# 1: 1 6 
4

これはバグではありませんが、afaikの動作を文書化しています。

test[J(globalenv()$mo)] 
    mo b 
1: 1 100 
関連する問題