[R] recursive functions and global variables

Luke Tierney luke at nokomis.stat.umn.edu
Mon Oct 15 12:18:18 CEST 2001


On Sun, Oct 14, 2001 at 08:00:49PM -0500, David A Richmond wrote:
> Hi again, 
> 	OK, I figured out how to get "new.env()" and "environment <-"
> (thanks for the advice!) to allow called functions to access the variables
> _created_ in the calling functions, but not the variables passed to the
> calling function in the first place. For example, consider:
> 
> test <- function(x) {
> 	new.env-> storage
> 	environment<-storage
> 	b <- x^2
> 	test2(storage)
> }
> 
> test2 <- function(e) {
> 	environment <- e
> 	cat("x =",x,"\n")
> 	cat("b =",b,"\n")
> 	return(b+1.1)
> }	
> 
> test(3)
> 
> This fails in 'cat("x =",x,"\n")' because test2() doesn't know what "x" is
> because it wasn't created in test(), but rather was a value passed to
> test. Is there any way to get test2() to recognize this variable? (I know
> I could simply make a copy x2 <- x in test(), but I'm trying to save
> space, in my final application the 'x' will be a big array.
> 
> dave

new.env and environment are functions--assigning to them as variables
doesn't do anything useful. But do you really need explicit
environment manipulation or is ordinary lexical scoping of definitions
enough?  That is,

test <- function(x) {
    test2 <- function() {
 	cat("x =",x,"\n")
 	cat("b =",b,"\n")
 	return(b+1.1)
    }
    b <- x^2
    test2()
}

test(3)

If you want to use explicitly constructed environments then you need
to access their contents by explicit calls to get or by explicit evals
in the environment.

Your original motivation for this was to prevent copying, but
arguments to functions are not copied, just marked as needing to be
copied on modify. So you may not really need any of this.

> 
> > On Sun, 14 Oct 2001, David A Richmond wrote:
> > 
> > > Hi,
> > > 	I am trying to write a recursive routine which passes some
> > > variables through the function calls but also refers to some global
> > > variables. I need the global variables because they are very big (n by n
> > > matrices where n is <= 1000) and I don't have the huge amount of memory
> > > needed to spawn dozens of copies of these matrices. The problem seems to
> > > be that while variables in the root environment of R are global, variables
> > > created in a function func1() are not available in functions called by
> > > func1(). (See the example below.) So I need a way to create some variables
> > > at the root level of a function that are available at any level
> > > 'underneath' the base function level. Note also that I want to be able to
> > > modify elements that are at a higher level as well.
> > >
> > 
> > You probably want to use a named environment. There's an example in the
> > `Programmer's Niche' section of the 2nd R newsletter, on the R home page.
> > 
> > Basically, you create an environment like
> > 
> >    storage<-new.env()
> > 
> > and pass it down through your functions. You can then use get() and
> > assign() to retrieve and modify objects in this environment.
> > 
> > This is often the R way to handle issues for which S-PLUS programmers
> > would use 'frame 0' and 'frame 1'.
> > 
> > 
> > 	-thomas
> > 
> > Thomas Lumley			Asst. Professor, Biostatistics
> > tlumley at u.washington.edu	University of Washington, Seattle
> > 
> > 
> 
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> |David Richmond                It works on a          |      
> + Dept. of Sociology          complex scientific      + 
> |Saint Mary's College          principle, known as    |  
> + Notre Dame, IN 46556               "pot luck."      +
> |219-284-4517                    - The Doctor         |
> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
> 
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

-- 
Luke Tierney
University of Minnesota                      Phone:           612-625-7843
School of Statistics                         Fax:             612-624-8868
313 Ford Hall, 224 Church St. S.E.           email:      luke at stat.umn.edu
Minneapolis, MN 55455 USA                    WWW:  http://www.stat.umn.edu
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list