[问题] 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