这可能是一个错误。在这种情况下,我将删除此问题并报告为错误。我希望有人看看以确保我没有做错什么,所以我不会浪费开发人员的时间。
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
. 还有其他人遇到同样的问题吗?
这可能是一个错误。在这种情况下,我将删除此问题并报告为错误。我希望有人看看以确保我没有做错什么,所以我不会浪费开发人员的时间。
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
. 还有其他人遇到同样的问题吗?
这是一个范围界定问题,类似于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
这不是错误,而是记录在案的行为 afaik。这是一个范围问题:
test[J(globalenv()$mo)]
mo b
1: 1 100