代码之家  ›  专栏  ›  技术社区  ›  JerryN

r data.table是否复制

  •  2
  • JerryN  · 技术社区  · 6 年前

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

    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 “在上面的代码中;在后面的代码中返回” 日期1 “。我把解决这个错误编码的方法放在了答案中,但我也有兴趣知道为什么 唯一(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 在里面 日期2 应该是 xxx 但在书面声明中 yyy 是的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   JerryN    6 年前

    把各种各样的解释放在一个地方,用对我有意义的语言…

    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 显示同一区域,现在显示

    既然记忆区域的信息已经改变了, 打印(唯一(dt.1$v1 显示器 而不是 XXX公司

    我采用的解决方案是

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

    具有

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