On 12-04-13 8:32 PM, Whit Armstrong wrote:
Is putting a variable into a list a deep copy (and is tracemem the
correct way to confirm)?

Yes, it is a deep copy, but done in a lazy way so tracemem won't show it. The copying won't be done until necessary, i.e. you modify it.



warmstrong@krypton:~/dvl/R.packages$ R
x<- rnorm(1000)
tracemem(x)
[1] "<0x3214c90>"
x.list<- list(x.in.list=x)
tracemem[0x3214c90 ->  0x2af0a20]:


Is it possible to put a variable into a list without causing a deep
copy (i.e. if you _really_ want the objects to share the same
underlying memory)?

At R level you can simulate it by storing things in environments: they aren't copied when you do assignments. So

x <- list(a=1, b=new.env())

y <- x

will cause x$a and y$a to be different objects, but x$b and y$b will be the same thing.

It may be possible to do it with other types in C code, but it will likely cause corruption when the garbage collector cleans up one copy. At C level you can do what you like with memory that isn't being managed by R.

Duncan Murdoch

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to