[問題] data.table setnames 奇怪的現象

作者: BUQ (固執又暴燥)   2017-12-07 20:50:11
[問題類型]:
程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
[軟體熟悉度]:
入門(寫過其他程式,只是對語法不熟悉)
[問題敘述]:
請簡略描述你所要做的事情,或是這個程式的目的
[程式範例]:
張貼能夠重現錯誤的程式碼,可以幫助版友更快的幫你解決問題
library(magrittr)
library(data.table)
dt1=data.table(type=c('aa','bb','cc'),class=c('01','02','03'),num=c(11,22,33))
dt2=dt1
setnames(dt2,'class','顆顆')
dt1 %>% colnames
dt2 %>% colnames
我在 setnames 改了dt2的colnames
但是 dt1的colnames 也被更改了
這是正常的嗎?
[環境敘述]:
R version 3.4.1 (2017-06-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
[關鍵字]:
選擇性,也許未來有用
data.table setnames
作者: clansoda (小笨)   2017-12-07 20:58:00
應該正常,但是我不知道怎麼解釋你用copy這個function看看,不要用=你這樣=像是告訴他這兩個是同一個人,只是名字不一樣不曉得我這樣解釋是不是正確的,如果有誤希望版友更正
作者: BUQ (固執又暴燥)   2017-12-07 21:10:00
可是用 <- 結果也一樣呀用copy這個function看看 〈-請問這是什麼意思
作者: obarisk (OSWALT)   2017-12-07 21:40:00
如果你無法理解就不要用data.table在data.tablea裡是正常,在R不是正常
作者: celestialgod (天)   2017-12-07 22:03:00
data.table的資料是存在指標...data.table這個物件只是一個地址你複製一個地址,但是你找到的地方還是同一個所以你改了地址上的一個東西,其實是改地方那最後地址找到的地方還是一樣的好像講得很複雜QQ
作者: BUQ (固執又暴燥)   2017-12-07 22:10:00
喔喔 了解 很像C語言的指標 謝謝 大大剛才試了一下 使用data.frame 後續仍用setnames改 結果一樣兩個都改變了colname但 若使用colnames(df2)[2]='顆顆' 則只有df2被改名好像 關鍵是在setnames這個函數 跟是data.table或data.table
作者: celestialgod (天)   2017-12-07 23:37:00
setnames是直接去改地址上的東西 `colnames<-`是複製出來改,所以不會變更到原本的就deep copy跟shadow copy差異吧(?)
作者: cywhale (cywhale)   2017-12-08 00:41:00
data.table這個pkg原生寫出來的func都直接去動記憶體位址你若不希望改到dt1, dt2 <- copy(dt1) %>% setnames(..)
作者: obarisk (OSWALT)   2017-12-08 08:11:00
setnames 是用data.table 的不要用,是完全不用library 載入
作者: BUQ (固執又暴燥)   2017-12-08 10:02:00
就是捨不得 setnames的功能 XD謝謝大家 我得到進一步的了解了 也從中看到繞過方法 <(_ _)>
作者: cywhale (cywhale)   2017-12-08 14:25:00
data.table作者Matt Dowle有一篇文章專門講判斷DT是否用指標位址這件事,值得一讀 https://goo.gl/ZiFrsr
作者: BUQ (固執又暴燥)   2017-12-08 19:18:00
@@ 好喔 謝謝
作者: obarisk (OSWALT)   2017-12-08 21:58:00
`names<-` or `colnames<-` or `rownames<-`

Links booklink

Contact Us: admin [ a t ] ucptt.com