【问题标题】:Make a shallow copy in data.table在 data.table 中进行浅拷贝
【发布时间】:2017-08-28 18:44:28
【问题描述】:

我在一个 SO 主题中读到了 Matt Dowle 关于 shallow 函数在 data.table 中制作浅拷贝的答案。但是,我再也找不到话题了。

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

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

DT2 = f(DT)

DT2 是一个data.table,其中n 列指向原始地址(没有深拷贝),另外一个仅存在于DT2。如果是,如果我执行DT2[, col3 := NULL]DT1 会附加什么内容?

【问题讨论】:

    标签: r data.table shallow-copy


    【解决方案1】:

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

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

    几天前此答案的更多背景信息: https://stackoverflow.com/a/45891502/403310

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

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

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

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

    【讨论】:

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