r - setDT() 有意想不到的副作用
问题描述
这个问题不是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 并行更改。除非已经知道答案,否则无法知道该问题是重复的。
解决方案
您的对象在内存中具有相同的地址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.frames 时,使用 as.data.table(.) 将它们转换为 data.table 可能既耗时又消耗内存,因为这将在转换之前制作输入对象的完整副本它到一个data.table。setDT 函数通过允许转换列表来解决这个问题 - 命名和未命名列表以及 data.frames 通过引用代替。也就是说,输入对象被原地修改,没有复制。
推荐阅读
- uinavigationcontroller - 为 iOS 13 暗模式模式 UINavigationBar 使用提升的背景颜色?
- r - 如何区分应用程序崩溃和用户关闭
- javascript - 无法将变量传递给 ajax url
- spring - 未使用 JPA 1.9 (postgresql) 设置数据类型 int 的默认值
- python-2.7 - Python正则表达式匹配包含只有字母数字和'-'和'_'的字符并且不以任何特殊字符开头或结尾的字符串
- bash - 如何在 shell 文件中使用粘贴命令
- java - Java 程序的元模型库
- python - 带有 __main__ 的 Prometheus Flask 导出器
- bash - 如何在git中获取最近一个月pom.xml文件中添加的插件和依赖项列表
- amazon-web-services - 如何设置 VSCode 以在本地调试 aws lambda?