[R] %+=% and eval.parent()

Peter Dalgaard p.dalgaard at biostat.ku.dk
Wed Apr 7 10:52:02 CEST 2004

Robin Hankin <rksh at soc.soton.ac.uk> writes:

> Hi again everybody.
> Yesterday I had a problem with c-style "+=" functions.  One suggestion
> was to define
> R> "plus<-" <- function(x,value){x+value}
> Then
> R> a <- matrix(1:9,3,3)
> R> plus(a[a%%2==1]) <- 1000
> works as desired.
> QUESTION: why does this behave differently:
> R> "plus<-" <- function(x,y){x+y}
> R> a <- matrix(1:9,3,3)
> R> plus(a[a%%2==1]) <- 1000
> Error in "plus<-"(`*tmp*`, value = 1000) :
> 	unused argument(s) (value ...)
> R>
> The only change seems to be changing the second argument from "value"
> to "y".  Why does this affect anything?  Where do I look for
> documentation on things like "plus<-"  ?

These assignment functions work basically by

 plus(x) <- foo 

getting internally transcribed as

 x <- "plus<-"(x, value=foo)

(actually, there's an intermediate alias for the target to avoid
multiple evaluation; this is what shows up as *tmp*, but you're not
supposed to know that...)

The use of the keyword matching form was prompted by some problems
with indexing functions that take a variable number of indices in
addition to x. (Think "[<-"(x,i,value) vs. "[<-"(x,i,j,value) and the
hoops you have to jump through when the value gets passed in the j
argument.) However, keyword matching of course implies that you need
to use the matching keyword in the function definition.

This *should* be somewhere in the R Language Definition, although I'm
not sure it is actually there. Or the blue book, although I suspect
that S v.3 actually used positional matching (and jumped through

   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907

More information about the R-help mailing list