我在一篇SO主题中读到了Matt Dowle关于在shallow
中制作浅层副本的data.table
函数的答案。但是,我再也找不到这个话题了。
data.table
没有任何名为shallow
的导出函数。有一个内部但没有记录。我可以安全地使用它吗?它的行为是什么?
我想做的是一个大表的内存有效副本。让DT
成为包含n
列的大表,f
是一个内存有效添加列的函数。有可能吗?
DT2 = f(DT)
DT2
为data.table
,n
列指向原始地址(无深拷贝),另外一列仅存在DT2
。如果是,如果我执行DT1
,会DT2[, col3 := NULL]
附加什么?
答案 0 :(得分:2)
你不能安全地使用data.table:::shallow
,不能。它故意不导出,不适合用户使用。从它本身的工作角度,或者它的名称或论据在未来发生变化。
话虽如此,您可以决定使用它,只要您可以i)保证您或您的用户不会在结果上调用:=
或set*
(如果您正在创建一个包)或ii)如果在结果上调用了:=
或set*
,那么您可以通过引用更改这两个对象。当data.table在内部使用浅层时,这就是我们自己的承诺。
前几天在这个答案中有更多背景: https://stackoverflow.com/a/45891502/403310
在那个问题中,我要求提供更大的图片:为什么需要这样做?明确这一点将有助于提高调查ALTREP或可能做我们自己的参考计数的优先级。
在你的问题中,你提到了你的大局,这非常有用。因此,您希望创建一个函数,将函数列添加到函数内的大数据表中,但不会更改大数据.table。你能解释一下为什么要创建这样的函数吗?为什么不加载big data.table,直接添加临时工作列,然后继续。您的R会话已经是数据存储器中的工作副本,该数据在其他地方持久存在。
请注意,我不是说不。我不是说你没有正当理由。我要求发现更多关于这个有效理由的信息,以便提高优先级。
如果这不是您所看到的答案,则搜索字符串“[data.table] shallow”返回当前有39个问题或答案。最糟糕的情况是,你可以通过这些来再次找到它。