Hello list,

I encountered some surprising behavior in R and wanted to check to see if I was 
imagining things. Previously, I thought that replacement/setter operators in 
prefix notation (e.g., `[<-`(x,1,y) rather than x[1] <- y) did not produce side 
effects (i.e., left 'x' unchanged), but just realized that this is not the case 
anymore (or has it always been this way? - I don't have access to old R 
distributions at the moment, but using R 2.10.1 on Ubuntu and OS X)? I went 
through the NEWS file but did not see a change documented if there was one, but 
just going by my recollection...

In any case, my understanding was that when modifying a value or attribute of 
an object, R reassigned the modified object to the original symbol. For 
instance, the help file for `name<-`() says that 

> names(z)[3] <- "c2"

is evaluated as

> z <- "names<-"(z, "[<-"(names(z), 3, "c2"))

But the final (re)assignment (`<-`) seems redundant as 

> invisible("names<-"(z, "[<-"(names(z), 3, "c2")))

does the same thing.

In this case, I wonder if there is a preferred way to use the 
replacement/setter operators in prefix notation without producing such side 
effects (replace() exists for `[<-`() and `[[<-`(), but perhaps something more 
general). For instance, if I did not desire the following modification in x:

> x <- c("1","2")
> y <- `names<-`(x,c("a","b"))
> y
  a   b 
"1" "2" 
> x
  a   b 
"1" "2" 
> 

I might take advantage of R's lazy evaluation and use create a copy in the 
local function environment and allow that copy to be modified:

> x <- c("1","2")
> y <- `names<-`(`<-`(x,x),c("a","b"))
> y
  a   b 
"1" "2" 
> x
[1] "1" "2"

The interesting thing is that `mode<-`(), while also a "setter" function in 
that it sets an object attribute, does not behave as `names<-`():

> x <- c("1","2")
> y <- `mode<-`(x,"integer")
> y
[1] 1 2
> x
[1] "1" "2"
> mode(x)
[1] "character"

So another question that naturally arises is whether there a general rule by 
which we can predict the behavior of these types of operators (whether they 
produce side effects or not)?

Thanks,

Stephen

______________________________________________
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