快速加入data.table(潜在错误,报告前检查)

时间:2013-01-08 16:07:19

标签: r merge data.table

这可能是个错误。在这种情况下,我将删除此问题并报告为错误。我希望有人看一看,确保我没有做错事,所以我不浪费开发时间。

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相同。有没有其他人得到同样的问题?

2 个答案:

答案 0 :(得分:9)

这是一个范围问题,类似于data.table-faq 2.13 (warning, 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]> 

正如链接常见问题解答中所建议的,一个简单的解决方案是重命名索引变量:

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

(由于i?data.table的文档中讨论的原因,这也会有效:

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

答案 1 :(得分:4)

这不是一个错误,但记录的行为是afaik。这是一个范围问题:

test[J(globalenv()$mo)]
   mo   b
1:  1 100