[R] Scoping rules
Peter Alspach
PAlspach at hortresearch.co.nz
Thu Oct 9 02:32:55 CEST 2003
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.
More information about the R-help
mailing list