2015-09-25 85 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