3
我想创建一个data.table的副本并更改新表中的列的名称。当我更改y $ V1的名称时,x $ V1的名称也会更改。为什么如此,以及如何避免这种行为?为什么setnames()会影响复制的表?
实施例:
x <- data.table(c(1,2,3),c(1,2,3))
y <- x
setnames(y, 'V1', 'new_name')
names(y) == names(x)
我想创建一个data.table的副本并更改新表中的列的名称。当我更改y $ V1的名称时,x $ V1的名称也会更改。为什么如此,以及如何避免这种行为?为什么setnames()会影响复制的表?
实施例:
x <- data.table(c(1,2,3),c(1,2,3))
y <- x
setnames(y, 'V1', 'new_name')
names(y) == names(x)
由于ř实现简单的引用计数,并在修改一般仅复制,而不是在分配。所以y = x
对于任何x
和y
不会复制任何东西,也不会创建新的对象。
结合一些data.table
函数可以在不复制的情况下修改对象的事实,如setnames
,您将看到您看到的效果。
使用copy
弗兰克提到强制显式复制。
谢谢埃迪的明确解释。 – 321k
因为它不是副本。看看'?copy'。相关:http://stackoverflow.com/q/15913417/1191259 – Frank
请查看CRAN软件包主页上的参考语义vignette(和其他小插曲)。 – Arun