2015-09-25 90 views
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) 
+4

因为它不是副本。看看'?copy'。相关:http://stackoverflow.com/q/15913417/1191259 – Frank

+0

请查看CRAN软件包主页上的参考语义vignette(和其他小插曲)。 – Arun

回答

7

由于ř实现简单的引用计数,并在修改一般仅复制,而不是在分配。所以y = x对于任何xy不会复制任何东西,也不会创建新的对象。

结合一些data.table函数可以在不复制的情况下修改对象的事实,如setnames,您将看到您看到的效果。

使用copy弗兰克提到强制显式复制。

+0

谢谢埃迪的明确解释。 – 321k