r - 避免在 R 中复制大对象 - get() 函数会复制吗?
问题描述
我有一个继承的一些 R 代码,它使用一个成语来避免复制大数据帧。当构建数据框的函数完成时,它不会返回数据框,而是将其存储在全局环境上下文中:
assign(df_name, df, envir = globalenv())
函数完成后,调用代码使用以下内容检索数据框:
df <- get(df_name, envir = globalenv())
我的问题是:get()
函数本身在返回值时是否真的会创建一个副本,从而创建这个习语本应避免的副本?如果是这样,有没有更好的方法来做到这一点?
解决方案
总之,这是胡说八道。在这里复制的是两个分配(通过assign
和<-
)。只需从函数返回对象就会保存一份副本。
顺便说一句,复制本身很便宜,因为 R 实现了一个名为“<a href="https://en.wikipedia.org/wiki/Copy-on-write" rel="nofollow noreferrer">copy on write”语义的概念:上面的命令在逻辑上确实会复制,但在物理上只会增加复制引用内的引用计数器。仅当您通过其中一个引用修改数据时,才会复制引用背后的实际数据。
推荐阅读
- azure - 什么是 Azure IoT Edge 仪表板上的“连接的客户端计数”
- android - Firebase Ui Paging 适配器的 notifyDataSetChanged 未更新 RecyclerView
- rest - 使用 id/passwd 直接从移动应用程序调用 restful api 的安全性
- javascript - 新复制的数组也会影响旧的原始数组 - JS
- c# - 如何在未在程序中选择的情况下检测按钮按下
- zeromq - 在 ZeroMQ 中,客户端如何检测到身份验证尝试失败?
- r - 用基于指标零和一的值填充 R 中的缺失向量
- python - 如何从频率表创建 pd.Series?
- typescript - 什么是使用 RxJS 在包含数组的 Observable 上迭代(并应用一些逻辑)的优雅解决方案?
- python - postgres DB 中的大 INSERTS 的 asyncpg 问题