Dear all,
I have a question about R's modification in place and replacement functions. I was working through Hadley Wickham's Advanced R section on Replacement Functions and in a file (say test.R) I wrote: `second<-` <- function(x, value) { x[2] <- value x } x <- 1:10 second(x) <- 5L print(x) library(pryr) x <- 1:10 print(address(x)) second(x) <- 6L print(address(x)) x <- 1:10 print(address(x)) x[2] <- 7L print(address(x)) When I copy-paste the code the effect is as expected: > `second<-` <- function(x, value) { + x[2] <- value + x + } > x <- 1:10 > second(x) <- 5L > print(x) [1] 1 5 3 4 5 6 7 8 9 10 > > library(pryr) > x <- 1:10 > print(address(x)) [1] "0x1b44ef40" > second(x) <- 6L > print(address(x)) [1] "0x1f955a38" > x <- 1:10 > print(address(x)) [1] "0x1b447090" > x[2] <- 7L > print(address(x)) [1] "0x1b447090" However, when I source the code the effect is a bit surprising: > source("test.R") [1] 1 5 3 4 5 6 7 8 9 10 [1] "0x2f372320" [1] "0x2f394888" [1] "0x1b446ef0" [1] "0x1f960f30" Notice, that the last two addresses are different. I would be grateful if somebody could point me to an explanation for this. I have tried this on: R version 3.1.2 running on openSUSE 12.1, R version 3.4.2 running on openSUSE Leap 42.3 and on R running on a friend's Mac. Thank you Best wishes Krzysztof Bartoszek ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-devel |
Basically as a result of all the bells and whistles source() supports
it ends up creating an additional reference to the value of each top level expression. That forces a duplicate. Best, luke On Sun, 13 May 2018, Krzysztof Bartoszek wrote: > Dear all, > I have a question about R's modification in place and replacement functions. > I was working through Hadley Wickham's Advanced R section on > Replacement Functions and > in a file (say test.R) I wrote: > > `second<-` <- function(x, value) { > x[2] <- value > x > } > x <- 1:10 > second(x) <- 5L > print(x) > > library(pryr) > x <- 1:10 > print(address(x)) > second(x) <- 6L > print(address(x)) > x <- 1:10 > print(address(x)) > x[2] <- 7L > print(address(x)) > > When I copy-paste the code the effect is as expected: >> `second<-` <- function(x, value) { > + x[2] <- value > + x > + } >> x <- 1:10 >> second(x) <- 5L >> print(x) > [1] 1 5 3 4 5 6 7 8 9 10 >> >> library(pryr) >> x <- 1:10 >> print(address(x)) > [1] "0x1b44ef40" >> second(x) <- 6L >> print(address(x)) > [1] "0x1f955a38" >> x <- 1:10 >> print(address(x)) > [1] "0x1b447090" >> x[2] <- 7L >> print(address(x)) > [1] "0x1b447090" > > However, when I source the code the effect is a bit surprising: >> source("test.R") > [1] 1 5 3 4 5 6 7 8 9 10 > [1] "0x2f372320" > [1] "0x2f394888" > [1] "0x1b446ef0" > [1] "0x1f960f30" > Notice, that the last two addresses are different. > I would be grateful if somebody could point me to an explanation for this. > I have tried this on: R version 3.1.2 running on openSUSE 12.1, R > version 3.4.2 running on openSUSE Leap 42.3 > and on R running on a friend's Mac. > > Thank you > Best wishes > Krzysztof Bartoszek > > ______________________________________________ > [hidden email] mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > -- Luke Tierney Ralph E. Wareham Professor of Mathematical Sciences University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: [hidden email] Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-devel |
Free forum by Nabble | Edit this page |