7

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

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

这将返回整个testdata.table 而不是返回的正确结果

test[J(1)]

我相信错误可能来自与test正在连接的表具有相同的列名,mo. 还有其他人遇到同样的问题吗?

4

2 回答 2

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

(这也将起作用,原因在 in 的文档中讨论i?data.table

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

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

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