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

Ale*_*lex 7 merge r data.table

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

test = data.table(mo=1:100, b=100:1, key=c("mo", "b"))
mo = 1
test[J(mo)]
Run Code Online (Sandbox Code Playgroud)

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

test[J(1)]
Run Code Online (Sandbox Code Playgroud)

我相信错误可能来自与test正在加入的表具有相同的列名,mo.有没有其他人得到同样的问题?

Jos*_*ien 9

这是一个范围问题,类似于data.table-faq 2.13(警告,pdf)中讨论的问题.因为test包含一个名为column的列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]> 
Run Code Online (Sandbox Code Playgroud)

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

MO <- 1
test[J(MO)]
#    mo b
# 1:  1 6
Run Code Online (Sandbox Code Playgroud)

(这也将工作,为的文件中讨论的原因i?data.table):

mo <- data.table(1)
test[mo]
#    mo b
# 1:  1 6
Run Code Online (Sandbox Code Playgroud)