[datatable-help] setnames changes names of other data.table

Matt Dowle mdowle at mdowle.plus.com
Sat Jan 11 15:36:44 CET 2014


Yes that's correct behaviour and desirable/crucial.   The set* functions 
and := do not copy-on-write,  unlike base. They work by reference.

See ?copy and  type example(copy) at the prompt.

If you *really* want to copy a 20GB in RAM,  use   DT2 <- copy(DT)

http://stackoverflow.com/questions/10225098/understanding-exactly-when-a-data-table-is-a-reference-to-vs-a-copy-of-another

Matt

On 11/01/14 14:18, Holger Kirsten wrote:
> In a debugging session, I found that setnames changed the names of an 
> identical data.table although having a different name>
>
> > ############### using setnames()
> > require(data.table)
> > mytab = data.table(a = letters[1:4], b = 1:4 )
> > str(mytab)
> Classes 'data.table' and 'data.frame':    4 obs. of  2 variables:
>  $ a: chr  "a" "b" "c" "d"
>  $ b: int  1 2 3 4
>  - attr(*, ".internal.selfref")=<externalptr>
> > mytab
>    a b
> 1: a 1
> 2: b 2
> 3: c 3
> 4: d 4
> >
> > othertab = mytab
> > othertab
>    a b
> 1: a 1
> 2: b 2
> 3: c 3
> 4: d 4
> > setnames(othertab, c("a", "b"), c("aa","bb"))
> > othertab
>    aa bb
> 1:  a  1
> 2:  b  2
> 3:  c  3
> 4:  d  4
> > mytab ## names have unexpectedly changed too
>    aa bb
> 1:  a  1
> 2:  b  2
> 3:  c  3
> 4:  d  4
> >
> > ############### using names()
> > mytab = data.table(a = letters[1:4], b = 1:4 )
> > str(mytab)
> Classes 'data.table' and 'data.frame':    4 obs. of  2 variables:
>  $ a: chr  "a" "b" "c" "d"
>  $ b: int  1 2 3 4
>  - attr(*, ".internal.selfref")=<externalptr>
> > mytab
>    a b
> 1: a 1
> 2: b 2
> 3: c 3
> 4: d 4
> >
> > othertab = mytab
> > othertab
>    a b
> 1: a 1
> 2: b 2
> 3: c 3
> 4: d 4
> > names(othertab) = c("aa","bb")
> Warning message:
> In `names<-.data.table`(`*tmp*`, value = c("aa", "bb")) :
>   The names(x)<-value syntax copies the whole table. This is due to <- 
> in R itself. Please change to setnames(x,old,new) which does not copy 
> and is faster. See help('setnames'). You can safely ignore this 
> warning if it is inconvenient to change right now. Setting 
> options(warn=2) turns this warning into an error, so you can then use 
> traceback() to find and change your names<- calls.
> > othertab
>    aa bb
> 1:  a  1
> 2:  b  2
> 3:  c  3
> 4:  d  4
> > mytab ## names unchanged as expected
>    a b
> 1: a 1
> 2: b 2
> 3: c 3
> 4: d 4
> >
> > sessionInfo()
> R version 3.0.1 (2013-05-16)
> Platform: x86_64-w64-mingw32/x64 (64-bit)
>
> locale:
> [1] LC_COLLATE=German_Germany.1252 LC_CTYPE=German_Germany.1252    
> LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                    
> LC_TIME=German_Germany.1252
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods base
>
> other attached packages:
> [1] data.table_1.8.10
>
> loaded via a namespace (and not attached):
> [1] tools_3.0.1
>
>
> _______________________________________________
> datatable-help mailing list
> datatable-help at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/datatable-help

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/datatable-help/attachments/20140111/35e55a73/attachment.html>


More information about the datatable-help mailing list