[R] pass by reference

William Dunlap wdunlap at tibco.com
Tue Aug 14 18:03:47 CEST 2012


You can write the replacement-function like [the untested[
   `col2<-` <- function(x, ..., value) {
       x$col2[x$col1 < 2] <- value
       x
    }
so you can do modifications with the syntax
   col2(data) <- "L"
If you also write the matching extractor
   col2 <- function(x) x$col2[x$col1 < 2]
then you can nest replacements with
   col2(data)[2] <- "L"

I like this syntax because it makes clear what is being modified
(things to the left of the assignment operator).  It may
or may not save memory or time, but as R develops 
replacement functions may get more efficient.

By the way, the syntax
    f <- function(data) {
        data <<- modify(data)
    }
is terrible because calling f(argument) creates a dataset called 'data'
(not 'argument') in some ancestral environment of the function (which
environment depends on where a previous dataset called 'data'
may have been defined). 

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of rest
> Sent: Tuesday, August 14, 2012 1:00 AM
> To: 'Sachinthaka Abeywardana'; r-help at r-project.org
> Subject: Re: [R] pass by reference
> 
> Hi Sachinthaka,
> You can do it in the following way:
> 
> getcol2<-function(data){
>   data$col2[data$col1<=2]="L"
>   data<<-data
>  }
> 
> <<- writes the result to  the underlying environment. This is however
> generally seen as very bad programming (side effects).
> Greet'
> Frans-----Oorspronkelijk bericht-----
> Van: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org]
> Namens Sachinthaka Abeywardana
> Verzonden: dinsdag 14 augustus 2012 3:08
> Aan: r-help at r-project.org
> Onderwerp: [R] pass by reference
> 
> Hi all,
> 
> I want to do the following:
> 
> data<-data.frame(col1=c(1,2,3,4,5))
> 
> getcol2<-function(data){
>     data$col2[data$col1<=2]="L"
> }
> 
> getcol2(data)
> 
> Unfortunately in the above col2 does not appear in the final data. So how
> would you pass this by reference such that you would get it back?
> 
> Thanks,
> Sachin
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at 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.
> 
> ______________________________________________
> R-help at 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.



More information about the R-help mailing list