在 data.table 中进行浅拷贝

Make a shallow copy in data.table

我在 SO 主题中阅读了 Matt Dowle 的回答,内容是关于在 data.table 中创建浅拷贝的 shallow 函数。然而,我又找不到话题了。

data.table 没有任何名为 shallow 的导出函数。有一个内部的但没有记录。我可以安全地使用它吗?它的行为是什么?

我想做的是大 table 的内存高效副本。设 DT 是一个大 table,有 n 列,f 是一个内存有效添加列的函数。这样的事情可能吗?

DT2 = f(DT)

with DT2 being a data.table with n columns pointing to the original addresses (no deep copies) and an extra one existing only for DT2.如果是,如果我做 DT2[, col3 := NULL]DT1 会附加什么?

你不能安全地使用 data.table:::shallow,不。它有意不导出,也不打算供用户使用。无论是从它本身的工作角度,还是它的名称或参数在未来改变。

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

几天前在此处回答的更多背景信息:

在那个问题中,我问了更大的问题:为什么需要这个?清楚这一点将有助于提高调查 ALTREP 或进行我们自己的引用计数的优先级。

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

请注意,我并不是说不。我并不是说你没有正当理由。我要求发现有关该正当理由的更多信息,以便提高优先级。

如果这不是您看到的答案,目前搜索字符串“[data.table] shallow”返回了 39 个问题或答案。最坏的情况是,您可以翻遍那些再找到它。