我在一个SO主题中读到了Matt Dowle的回答,他提到了一个用于在data.table中创建浅拷贝的
我想做的是对一个大表进行内存高效的复制。假设
shallow
函数。然而,我无法再次找到这个主题。
data.table
没有任何导出名为shallow
的函数。虽然有一个内部函数,但没有文档记录。我能安全地使用它吗?它的行为是什么?我想做的是对一个大表进行内存高效的复制。假设
DT
是一个具有n
列的大表,f
是一种内存高效添加列的函数。这种操作是否可行?DT2 = f(DT)
如果DT2
是一个指向原始地址的具有n
列的data.table
(没有深度复制),并且仅存在于DT2
中,则会发生什么? 如果我执行DT2 [,col3:= NULL]
,则DT1
会发生什么变化?
data.table
中的浅层复制而问自己的。但也为我的用户考虑。实际上,用户不熟悉引用更新。我的一些函数都像set*
函数一样设计,并通过引用添加列。但我经常收到电子邮件询问为什么函数返回 NULL(invisible()
),即使文档清楚地说明了内部行为。我想知道是否浅拷贝可以使工作流程更简单,同时也具有相同的内存效率。 - JRRset*
语义,它是最好的方式,也是最安全的方式。我只是在质疑技术可能性,因为我喜欢技术问题。 - JRRoptim
多次调用,它会创建动态确定数量的列,而这些列在函数外部是不需要的。使用shallow
代替原始输入,我可以避免清除这些列时的麻烦。我还将其与一次性函数一起使用,只是为了避免担心我的输入数据被搞乱;我想我可以为这些函数切换到使用copy
。 - Frankcopy()
和DT[,..someCols]
都可以更改为返回浅复制,然后可以删除内部的“shallow”。 只要:=
能够可靠地读取列的引用计数(这之前是问题)。 - Matt Dowle