此问题不是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同时更改。除非已经知道答案,否则无法知道该问题是重复的。
答案 0 :(得分:4)
您的对象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来解决此问题。也就是说,输入对象被修改到位,没有被复制。