[R] Change global env variables from within a function

David Winsemius dwinsemius at comcast.net
Wed Oct 13 22:01:59 CEST 2010


On Oct 13, 2010, at 2:19 PM, Jon Zadra wrote:

> 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.

There already is a function (or perhaps a composition of two  
functions) that does what you ask. It's the '<-' method for names()  
usually invoked in its dyadic form:

names(object) <- character_vector

 > df <- data.frame(one=rnorm(10), two=rnorm(10))
 > names(df) <- c("three", "four")
 > names(df)
[1] "three" "four"

In your case it would work like this:

 > names(tempdf)[ which(names(tempdf)=="a") ] <- "g"
 > names(tempdf)
[1] "g" "b"

-- 
David.

>
> 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.

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list