setDT() 有意外的副作用 [duplicate]

setDT() has unexpected side effect [duplicate]

提问人:Robert Hadow 提问时间:7/10/2018 最后编辑:Robert Hadow 更新时间:7/10/2018 访问量:667

问:

此问题不是 data.table 包中 setDT 中的错误重复。

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

为什么要对一个不是其参数的对象采取行动?setDT()

谢谢大家指出为什么虹膜与 dt 并行更改。除非一个人已经知道答案,否则没有办法知道这个问题是重复的。

r data.table

答:

4赞 jay.sf 7/10/2018 #1

您的对象,并在内存中具有相同的地址。您可以通过以下方式制作真正的副本。irisdtdt <- 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)来解决此问题。也就是说,输入对象已就地修改,不会进行任何复制。