首页 > 解决方案 > 避免在 R 中复制大对象 - get() 函数会复制吗?

问题描述

我有一个继承的一些 R 代码,它使用一个成语来避免复制大数据帧。当构建数据框的函数完成时,它不会返回数据框,而是将其存储在全局环境上下文中:

assign(df_name, df, envir = globalenv())

函数完成后,调用代码使用以下内容检索数据框:

df <- get(df_name, envir = globalenv())

我的问题是:get()函数本身在返回值时是否真的会创建一个副本,从而创建这个习语本应避免的副本?如果是这样,有没有更好的方法来做到这一点?

标签: r

解决方案


总之,这是胡说八道。在这里复制的是两个分配(通过assign<-)。只需从函数返回对象就会保存一份副本。

顺便说一句,复制本身很便宜,因为 R 实现了一个名为“<a href="https://en.wikipedia.org/wiki/Copy-on-write" rel="nofollow noreferrer">copy on write”语义的概念:上面的命令在逻辑上确实会复制,但在物理上只会增加复制引用内的引用计数器。仅当您通过其中一个引用修改数据时,才会复制引用背后的实际数据。


推荐阅读