[R] Scoping rules

Thomas Lumley tlumley at u.washington.edu
Thu Oct 9 04:17:48 CEST 2003


On Wed, 8 Oct 2003, Roger D. Peng wrote:

> It seems like you want in fnB
>
> get(AA$first, envir = parent.frame(1))
>
> but I'm entirely clear on why your original function doesn't work.  My
> understanding was that get() should search through the parent frames.

No, get() searches through the enclosing frames, like ordinary variable
lookup.  The only way to get dynamic scope is to specify it explicitly

	-thomas

> -roger
>
> Peter Alspach wrote:
> > Dear List members:
> >
> > I'm using R1.7.1 (Windows 2000) and having difficulty with scoping.
> > I've studied the FAQ and on-line manuals and think I have identified
> > the
> > source of my difficulty, but cannot work out the solution.
> >
> > For the purposes of illustration.  I have three functions as defined
> > below:
> >
> > fnA <- function(my.x)
> > {
> >   list(first=as.character(substitute(my.x)), second=sqrt(my.x))
> > }
> >
> > fnB <- function(AA)
> > {
> >   tmp.x <- get(AA$first)
> >   tmp.x^2
> > }
> >
> > fnC <- function()
> > {
> >   x <- 1:2
> >   y <- fnA(x)
> >   z <- fnB(y)
> >   c(x,y,z)
> > }
> >
> > fnA() has a vector as an argument and returns the name of the vector
> > and the square root of its elements in a list.  fn(B) takes the result
> > of fn(A) as its argument, gets the appropriate vector and computes the
> > square of its elements.  These work fine when called at the command
> > line.
> >
> > fnC() defines a local vector x and calls fnA() which operates on this
> > vector.  Then fnB() is called, but it operates on a global vector x in
> > GlobalEnv (or returns an error is x doesn't exist there) - but I want
> > it
> > to operate on the local vector.
> >
> > I think this is related to the enclosing environment of all three
> > functions being GlobalEnv (since they were created at the command
> > line),
> > but the parent environment of fnB() being different when invoked from
> > within fnC().
> >
> > My questions:
> >
> > 1  Have I correctly understood the issue ?
> > 2  How do I make fnB() operate on the local vector rather than the
> > global one ?
> > 3  And, as an aside, I have used as.character(substitute(my.x)) to
> > pass
> > the name - but deparse(substitute(my.x)) also works.  Is there any
> > reason to prefer one over the other?
> >
> > Thank you ...........
> >
> >
> > Peter Alspach
> >
> >
> >
> > ______________________________________________________
> > The contents of this e-mail are privileged and/or confidential to the
> > named recipient and are not to be used by any other person and/or
> > organisation. If you have received this e-mail in error, please notify
> > the sender and delete all material pertaining to this e-mail.
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> >
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
>

Thomas Lumley			Assoc. Professor, Biostatistics
tlumley at u.washington.edu	University of Washington, Seattle




More information about the R-help mailing list