setDT()有意外的副作用

时间:2018-07-09 19:17:04

标签: r data.table

此问题不是Error in setDT from data.table package的重复。

library(data.table)
dt <- iris
str(iris) # a data.frame solely
setDT(dt)
str(iris) # data.frame and data.table

setDT()为什么要作用于不是其参数的对象?

谢谢大家指出为什么虹膜与dt同时更改。除非已经知道答案,否则无法知道该问题是重复的。

1 个答案:

答案 0 :(得分:4)

您的对象irisdt在内存中具有相同的地址。您可以通过dt <- data.table::copy(iris)制作真实副本。

考虑一下:

dt <- iris
> tracemem(iris) == tracemem(dt)
[1] TRUE

但是

dt <- data.table::copy(iris)
> tracemem(iris) == tracemem(dt)
[1] FALSE

原因

?data.table::setDT说:

  

在处理大型列表或data.frame时,使用as.data.table(。)将它们转换为data.table可能既耗时又耗费内存,因为这将生成输入对象的完整副本。在将其转换为data.table之前。 setDT函数通过允许转换列表-命名列表和未命名列表以及通过引用的data.frames来解决此问题。也就是说,输入对象被修改到位,没有被复制。