【问题标题】:Data table update by reference changes other data table [duplicate]通过引用更新数据表更改其他数据表[重复]
【发布时间】:2019-01-16 06:37:25
【问题描述】:

我有点难以理解为什么数据表会更新不同数据表的列。

请考虑以下可重现的代码。

library(data.table)
dt <- data.table(a=rep(letters[1:4], 5), 
             b=rep(letters[5:8], 5),
             c=rep(letters[3:6], 5),
             x=sample(1:100, 20),
             y=sample(1:100, 20),
             z=sample(1:100, 20))

假设我将 dt 分配给 dt.1:

dt.1 <- dt

接下来,假设我通过引用 dt.1 中的列来更新:

dt.1[, x:= x^2]

x列确实是平方的,但是dt中的x列也是平方的,即

dt[,x :=x^2] 在后台执行。

为什么会发生这种情况,如何防止这种类型的更新/依赖发生?

谢谢

【问题讨论】:

  • 使用dt.1 &lt;- copy(dt) 创建一个物理上独立的副本。
  • 几个月前我被这个欺骗了,在 SO 上找不到答案,然后发布我的问题只是为了将其标记为 dup。我认为关于这个的“已经回答的问题”需要更好的标题,特别是因为这种行为与 data.frames 不一致,并且对于 data.table 的新用户来说尤其麻烦和困惑,他们(像我一样)很难知道什么是为了搜索它,调用了问题。
  • 感谢大家的帮助。和丹一样,我在写这篇文章之前做了很多谷歌搜索,因为我不知道如何“引用”这个问题。但无论如何,感谢您的帮助!
  • @DanY 和@plausibly_exogenous 我同意链接的欺骗问题的标题有些“复杂”。但是,official data.table Vignette on reference semantics 在解释大多数这些问题方面做得非常出色。

标签: r data.table


【解决方案1】:

因为data.tables reference semantics在做

dt.1 <- dt

表示dt.1dt指的是内存中的同一个对象。修改一个修改另一个。换句话说,dt.1dt. 的浅拷贝(指针的副本)

您可以通过以下方式执行深层复制

dt.1 <- copy(dt)

这将在内存中创建dt 的第二个副本。对dt.1 的任何修改都不会影响原始副本dt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2021-06-26
    • 2019-06-16
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多