我创建一个主数据表,从中提取较小的表,然后将它们组合成新表。过程是这样的
dt.master
创建它的副本并进行一些编辑。示例脚本是
dt.1 <- copy(dt.master)
dt.1 <- dt.1[ v1 %in% "cat1".]
创建dt.1的其他版本,并进行一些编辑。这是输入错误的代码)
dt.2 <- dt.3 <- dt.1
按如下所示编辑每个新版本
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
。
答案 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)