[R] pass by reference -- how to do it

Liaw, Andy andy_liaw at merck.com
Wed Feb 18 14:55:45 CET 2004


One needs to be more careful with "<<-" in R than in S-PLUS, because of the
scoping rule difference.  ?"<<-" says:

     The operators '<<-' and '->>' cause a search to made through the
     environment for an existing definition of the variable being
     assigned.  If such a variable is found then its value is
     redefined, otherwise assignment takes place globally. Note that
     their semantics differ from that in the S language, but is useful
     in conjunction with the scoping rules of R.

Andy

> From: Gabor Grothendieck
> 
> If you don't mind NOT passing your arrays at all then you 
> can do this:
> 
> f <- function() a[1] <<- a[1] + 1
> a <- 1:5
> f()  # increments first element of a by 1
> a     # c(2,2,3,4,5)
> 
> The <<- causes the expression to take place in the global 
> environment.
> 
> If you want to actually pass your arrays by reference then the
> following works although its a bit messy:
> 
> g <- function(z) eval(eval(substitute(expression(z[1] <<- z[1]+1))))
> a <- 1:5
> g(a)  # increments first element of a by 1
> a     # c(2,2,3,4,5)
> 
> The <<- causes the expression to be evaluated in the global 
> environment. expression() turns its argument into an object
> of mode expression.  substitute() replaces z with the argument 
> passed to f in that expression and returns an object of mode 
> call.  The inner eval turns the object of mode call into an 
> object of mode expression and the outer eval evaluates that 
> expression.  
> 
> ---
> Date:   Tue, 17 Feb 2004 13:23:58 -0800 (PST) 
> From:   Robert Dodier <robert_dodier at yahoo.com>
> To:   <r-help at stat.math.ethz.ch> 
> Subject:   [R] pass by reference -- how to do it 
> 
>  
> Hello,
> 
> Pass by reference appears to be a topic which comes up
> from time to time, but I wasn't able to find something in
> the R-help archives which tells how to accomplish it.
> 
> I have a problem that you may have seen before -- R runs
> out of memory when processing large matrices. Part of the
> problem for me is that I am using some large matrices as
> function arguments, and these are modified, which leads 
> to allocating copies of the matrices. 
> 
> I would like to do the modification "in place" so that
> a copy is not required. Thanks for any light you can shed
> on this.
> 
> If you're tempted to tell me "you don't really want to do that" --
> let me save you the trouble. You are so very right! Indeed I
> don't want to have pass by reference variables. OTOH I don't
> want R to come to a dead halt at an inconvenient time either.
> 
> Thanks for your help,
> Robert Dodier
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
> 
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
> 
> 


------------------------------------------------------------------------------
Notice:  This e-mail message, together with any attachments,...{{dropped}}




More information about the R-help mailing list