[R] Basic function output/scope question

Erik Iverson eiverson at NMDP.ORG
Mon Sep 21 17:50:11 CEST 2009


I see you've already been told about "<<-".  The reason I (and presumably others?) stay away from that construct is that your function then has side effects that a user (even yourself) may not anticipate or want, namely possibly overwriting a previous variable in your global environment.  The help for ?<<- 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 (and its binding is not
     locked) then its value is redefined, otherwise assignment takes
     place in the global environment."

So this is not even guaranteed to assign in the Global Environment!!

 To follow-up on my previous email, you usually assign the results of your function call to a variable if you want to use them further. For example, 

## return both x and y
testfunc2 <- function(x) {
   y <- 10
   list(x, y)
}

my.var <- testfunc2(4)

another.function(my.var)

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org]
> On Behalf Of Erik Iverson
> Sent: Monday, September 21, 2009 10:43 AM
> To: David Young; r-help at r-project.org
> Subject: Re: [R] Basic function output/scope question
> 
> Hello,
> 
> >
> > testfunc<-function(x)
> > { y<-10
> > print(y)
> > print(x)
> > }
> >
> > testfunc(4)
> >
> > The variables x and y are accessible during execution of the function
> > "testfunc" but not afterwards.
> 
> In R, expressions return values.  When you define a function, ?function
> says that, "If the end of a function is reached without calling 'return',
> the value of the last evaluated expression is returned."
> 
> So you are correct, 'x' and 'y' are local variables, and by all accounts
> they should be.  If you want their values accessible, simply return them.
> 
> ## return just y
> testfunc2 <- function(x) {
>    y <- 10
>    y
> }
> 
> ## return both x and y
> testfunc2 <- function(x) {
>    y <- 10
>    list(x, y)
> }
> 
> There are ways to make x and y global from within a function, but in
> general that is not the R way to do things!
> 
> Hope that helps,
> Erik Iverson
> 
> ______________________________________________
> 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