提问人:Robert Hadow 提问时间:7/10/2018 最后编辑:Robert Hadow 更新时间:7/10/2018 访问量:667
setDT() 有意外的副作用 [duplicate]
setDT() has unexpected side effect [duplicate]
问:
此问题不是 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 并行更改。除非一个人已经知道答案,否则没有办法知道这个问题是重复的。
答:
4赞
jay.sf
7/10/2018
#1
您的对象,并在内存中具有相同的地址。您可以通过以下方式制作真正的副本。iris
dt
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)来解决此问题。也就是说,输入对象已就地修改,不会进行任何复制。
评论