【问题标题】:setDT() has unexpected side effect [duplicate]setDT() 有意想不到的副作用[重复]
【发布时间】:2018-12-17 13:19:30
【问题描述】:

此问题与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() 应该作用于不是其参数的对象?

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

【问题讨论】:

标签: r data.table


【解决方案1】:

您的对象irisdt 在内存中具有相同的地址。您可以通过dt &lt;- 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 通过引用代替。也就是说,输入对象被原地修改,没有复制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2013-07-19
    相关资源
    最近更新 更多