在 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 个问题或答案。最坏的情况是,您可以翻遍那些再找到它。
我在 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 个问题或答案。最坏的情况是,您可以翻遍那些再找到它。