Krzysztof Bartoszek
2018-May-13 16:59 UTC
[Rd] different type of modification when code is sourced and pasted
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
luke-tier@ey m@ili@g off uiow@@edu
2018-May-13 20:44 UTC
[Rd] different type of modification when code is sourced and pasted
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 > > ______________________________________________ > R-devel at r-project.org 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: luke-tierney at uiowa.edu Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu