[Rd] Understanding modification in place

Hadley Wickham h.wickham at gmail.com
Wed Jul 24 16:35:17 CEST 2013


Hi all,

Take this simple script, which I'm trying to use to understand when
modification in-place occurs, and when a new object is created:

message("Global")
x <- 1:3
.Internal(inspect(x))
x[2] <- 1L
.Internal(inspect(x))

message("In function")
(function() {
  x <- 1:3
  .Internal(inspect(x))
  x[2] <- 1L
  .Internal(inspect(x))
})()

If I run it from the command line, I get:

Global
@1050bb840 13 INTSXP g0c2 [MARK,NAM(1)] (len=3, tl=0) 1,2,3
@1050bb840 13 INTSXP g0c2 [MARK,NAM(1)] (len=3, tl=0) 1,1,3
In function
@1050bb190 13 INTSXP g0c2 [NAM(1)] (len=3, tl=0) 1,2,3
@1050bb190 13 INTSXP g0c2 [NAM(1)] (len=3, tl=0) 1,1,3

i.e. both modifications occur in place.

If I put it in a file and source() it, I get:

Global
@1050bb318 13 INTSXP g0c2 [NAM(2)] (len=3, tl=0) 1,2,3
@1050bb698 13 INTSXP g0c2 [NAM(1)] (len=3, tl=0) 1,1,3
In function
@1050b8958 13 INTSXP g0c2 [NAM(1)] (len=3, tl=0) 1,2,3
@1050b8958 13 INTSXP g0c2 [NAM(1)] (len=3, tl=0) 1,1,3

i.e. in the global environment a copy is created.

Why is there a difference?

Thanks!

Hadley

-- 
Chief Scientist, RStudio
http://had.co.nz/



More information about the R-devel mailing list