这可能是个错误。在这种情况下,我将删除此问题并报告为错误。我希望有人看一看,确保我没有做错事,所以我不浪费开发时间。
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
相同。有没有其他人得到同样的问题?
答案 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