Data.table: DT[TRUE] 可能导致无效密钥

创建于 2018-12-13  ·  4评论  ·  资料来源: Rdatatable/data.table

我没有意识到DT[TRUE]是一种实现浅拷贝的方法。 浅拷贝仅供内部使用。 感谢@renkun-ken 在#3214 和相关的#2254 中强调了这一点。

  • [x] #3214
  • [ ] #2254

在 v1.11.8 中,我们看到:

DT = data.table(id = 1:5, key="id")
DT1 = DT[TRUE]
key(DT1)
[1] "id"
DT1[3, id:=6L]
key(DT1)
# NULL              # correct
DT$id
# [1] 1 2 6 4 5     # should be 1:5
key(DT)
# [1] "id"          # invalid key

它只发生在DT[TRUE] ,iiuc 之后,希望人们没有发现或依赖太多?! 我希望那里的用法就像@renkun-ken 描述的那样,将新列添加到浅拷贝,而不是更改现有列!

新的测试 1542.08 已添加到 PR #2313 中,准备在修复此问题时使用。

最有用的评论

是的,setkey,更改现有列不应该用于浅拷贝,因为列本身不会被复制。

所有4条评论

是的,setkey,更改现有列不应该用于浅拷贝,因为列本身不会被复制。

如果我们不允许使用dt[TRUE]进行浅拷贝,此问题将自动解决。

最终。 但与此同时,我们不能破坏@renkun-ken 的工作流程。
更多细节在这里: https :

可以将以下代码添加到测试中以确保复制行为

DT = data.table(a=c(1,2), b=c("b","a"))
address(DT)
address(DT[])
address(DT[, .SD])
address(DT[TRUE])
sapply(DT, address)
sapply(DT[], address)
sapply(DT[, .SD], address)
sapply(DT[TRUE], address)
此页面是否有帮助?
0 / 5 - 0 等级