首页 > 解决方案 > setDT() 有意想不到的副作用

问题描述

这个问题不是Error in setDTfrom data.tablepackage的重复。

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

为什么要setDT()作用于不是它的论点的对象?

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

标签: rdata.table

解决方案


您的对象在内存中具有相同的地址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.frames 时,使用 as.data.table(.) 将它们转换为 data.table 可能既耗时又消耗内存,因为这将在转换之前制作输入对象的完整副本它到一个data.table。setDT 函数通过允许转换列表来解决这个问题 - 命名和未命名列表以及 data.frames 通过引用代替。也就是说,输入对象被原地修改,没有复制。


推荐阅读