[R] recursive functions and global variables
David A Richmond
richmond at saintmarys.edu
Mon Oct 15 03:00:49 CEST 2001
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
On Sun, 14 Oct 2001, Thomas Lumley wrote:
> 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
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list