R 在data.table中进行浅拷贝

R 在data.table中进行浅拷贝,r,data.table,shallow-copy,R,Data.table,Shallow Copy,我在一个SO主题中读到Matt Dowle关于浅拷贝函数的回答,该函数用于在数据表中进行浅拷贝。然而,我再也找不到这个话题了 数据。表没有任何名为浅层的导出函数。有一个内部的,但没有记录。我能安全地使用它吗?它的行为是什么 我想做的是一个大表的高效内存拷贝。让DT成为一个大表,其中包含n列和f一个内存有效地添加列的函数。这样可能吗 DT2 = f(DT) DT2是一个数据表,其中n列指向原始地址(无深度副本),另一列仅存在于DT2中。如果是,如果我使用DT2[,col3:=NULL],那么DT

我在一个SO主题中读到Matt Dowle关于
浅拷贝
函数的回答,该函数用于在
数据表
中进行浅拷贝。然而,我再也找不到这个话题了

数据。表
没有任何名为
浅层
的导出函数。有一个内部的,但没有记录。我能安全地使用它吗?它的行为是什么

我想做的是一个大表的高效内存拷贝。让
DT
成为一个大表,其中包含
n
列和
f
一个内存有效地添加列的函数。这样可能吗

DT2 = f(DT)

DT2
是一个
数据表
,其中
n
列指向原始地址(无深度副本),另一列仅存在于
DT2
中。如果是,如果我使用
DT2[,col3:=NULL]
,那么
DT1的附加内容是什么?

您不能安全地使用
数据。表:::shallow
,否。它是故意不导出的,也不是供用户使用的。无论是从它自身工作的角度来看,还是从它的名称或参数在未来发生变化的角度来看

话虽如此,您可以决定使用它,只要您能保证
:=
set*
不会被您或您的用户调用(如果您正在创建包)或者ii)如果对结果调用了
:=
set*
,则可以通过引用更改这两个对象。当data.table在内部使用shall时,这就是我们承诺的

在几天前的回答中,这里有更多的背景:

在这个问题上,我问了一个更大的问题:为什么需要这样做?明确这一点将有助于提高调查ALTREP或进行我们自己的参考计数的优先级

在你的问题中,你提到了你的大局,这是非常有用的。因此,您希望创建一个函数,将工作列添加到函数内的bigdata.table中,但不更改bigdata.table。你能解释一下为什么要创建这样的函数吗?为什么不加载bigdata.table,直接向其中添加临时工作列,然后继续。您的R会话已经是内存中数据的工作副本,该数据在其他地方是持久的

请注意,我不是说不。我不是说你没有正当的理由。我要求更多地了解这一正当理由,以便提高优先权


如果这不是您看到的答案,那么搜索字符串“[data.table]shallow”当前返回了39个问题或答案。最糟糕的情况是,你可以通过拖网再次找到它。

谢谢。实际上,为了更好地理解
data.table
中的浅拷贝,这或多或少是我自己的一个问题。也适用于我的用户。实际上用户并不熟悉引用更新。我的一些函数的设计类似于
set*
函数,并通过引用添加列。但我经常收到电子邮件,问我为什么函数返回NULL(
invisible()
),即使文档中明确说明了内部行为。我想知道一个浅显的副本是否能让工作流程更简单,但同样也能提高内存效率。说清楚一点:我从来没有想过我的想法是个好主意。我也不打算编写这样的函数。实际上,我喜欢
set*
语义,这是最好的方法,也是最安全的方法。我只是在问技术上的可能性,因为我喜欢技术上的问题。(这里的另一个用户:)关于为什么,我有一个被多次调用的函数(由
optim
),它创建了一个动态确定的列数,我不需要在函数之外。使用
shall
而不是原始输入,我想我可以避免清除这些列的麻烦。我还将其用于一次性功能,只是为了避免担心输入数据被弄乱;我想我可以改用
copy
,谢谢大家。我同意这是必要的。我想我要什么?我猜一个可运行的例子展示了一些非琐碎的东西,显示了我的需求,并且我可以用它进行测试。我认为
copy()
DT[,someCols]
都可以更改为返回浅拷贝,然后可以删除内部
浅拷贝。只要
:=
能够可靠地读取列的引用计数(这是以前的问题)。一个关于公共数据的可运行示例构成文章的基础,肯定会有助于提高优先级。特别是如果是别人写的。