[R] Change global env variables from within a function

Greg Snow Greg.Snow at imail.org
Wed Oct 13 21:36:08 CEST 2010


R is primarily a function language not a macro language and what you are trying to do matches more with macro programming.

The best approach is to think functionally and learn the more Rish ways of doing things (have the function return the changed data and the caller does the replacement, like has been shown in other responses).

If you really want the macro behavior (and are willing to live with the consequences (don't complain that you were not warned)), then look at the defmacro function in the gtools package and the article in the reference section on its help page. 

-- 
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.snow at imail.org
801.408.8111


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-
> project.org] On Behalf Of Jon Zadra
> Sent: Wednesday, October 13, 2010 12:20 PM
> To: r-help at r-project.org
> Subject: [R] Change global env variables from within a function
> 
>   Hi,
> 
> I've looked all over for a solution to this, but haven't had much look
> in specifying what I want to do with appropriate search terms.  Thus
> I'm
> turning to R-help.
> 
> In the process of trying to write a simple function to rename
> individual
> column names in a data frame, I ran into the following problem: When I
> rename the columns within my function, I can't seem to get it to apply
> to the data frame in the global environment in a simple manner.
> 
> Given:
> 
> tempdf <- data.frame("a" = 1:6, "b" = 7:12)
> 
> #I can rename a to g this way:
> names(tempdf)[names(tempdf)=="a"] <- "g"
> 
> #Wanting to simplify this for the future, I have the function:
> colrename <- function(dframe, oldname, newname) {
>      names(dframe)[names(dframe)==oldname] <- newname
>      }
> 
> colrename(tempdf, "a", "g")
> 
> #However of course the change to tempdf stays within colrename().  I
> could add "return(names(dframe))" to the function and then call the
> function like:
> #names(tempdf) <- colrename(tempdf, "a", "g")
> #but at that point its not much simpler than the original:
> #names(tempdf)[names(tempdf)=="a"] <- "g"
> 
> So, i'm wondering, is there a way to write code within that function so
> that the tempdf in the global environment gets changed?
> I thought of doing "names(dframe)[names(dframe)==oldname] <<- newname"
> but then of course it doesn't replace "dframe" with "tempdf" in the
> evaluation, so it seems to be a problem of looking at some variables
> within the function environment but others in the parent environment.
> 
> Any help is greatly appreciated.
> 
> Thanks,
> 
> Jon
> --
> Jon Zadra
> Department of Psychology
> University of Virginia
> P.O. Box 400400
> Charlottesville VA 22904
> (434) 982-4744
> email: zadra at virginia.edu
> <http://www.google.com/calendar/embed?src=jzadra%40gmail.com>
> 
> ______________________________________________
> 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