r data.table复制或不复制

时间:2018-10-07 17:20:49

标签: r data.table

我创建一个主数据表,从中提取较小的表,然后将它们组合成新表。过程是这样的

  1. 从其他一些数据创建一个主表。称为dt.master
  2. 创建它的副本并进行一些编辑。示例脚本是

    dt.1 <- copy(dt.master)
    dt.1 <- dt.1[ v1 %in% "cat1".]
    
  3. 创建dt.1的其他版本,并进行一些编辑。这是输入错误的代码)

    dt.2 <- dt.3  <- dt.1
    
  4. 按如下所示编辑每个新版本

    dt.2[, v1 := "dt.2"]
    unique(dt.2$v1)
    dt.3[, v1 := "dt.3"]
    unique(dt.2$v1)
    

我知道(并最终记住)dt.3 <- dt.1不会创建dt.1的新版本。但是unique(dt.2$v1)在上面的代码中返回“ dt.2”;在随后的代码中,它返回“ dt.1”。我将解决此错误代码的方法放入答案中,但也想知道为什么unique(dt.2$v1)返回不同的答案。这是一些示例代码演示了这一点

dt.master <- data.table(v1 = c("cat1", "cat1", "cat2", "cat","cat2" ), v2 = c(1,2,3,4,5))
dt.1 <- copy(dt.master)
dt.1 <- dt.1[v1 %in% "cat1",]
dt.2 <- dt.3  <- dt.1
dt.2[, v1 := "xxx"]
unique(dt.2$v1)
dt.3[, v1 := "yyy"]
unique(dt.3$v1)
print(dt.2)
v1中的

dt.2应该是xxx,但在print语句中,它应该是yyy

1 个答案:

答案 0 :(得分:1)

将对我来说有意义的各种解释放在一个地方并用一种语言表达...

dt.2 <- dt.3 <- dt.1具有三个指向单个内存区域的指针

dt.1[, v1 := "xxx"]将该区域的一部分设置为xxx

print(unique(dt.1$v1显示该区域并显示xxx

dt.2[, v1 := "yyy"]将该区域的相同部分更改为yyy

print(unique(dt.2$v1显示相同的区域,现在显示yyy

现在,该内存区域中的信息已更改, print(unique(dt.1$v1显示yyy而不是xxx

我采用的解决方案是替换

dt.2 <- dt.3  <- dt.1

使用

dt.2 <- copy(dt.1)
dt.3 <- copy(dt.1)