[R] Help with using 'get' function and variable scope
Gabor Grothendieck
ggrothendieck at gmail.com
Fri Apr 18 13:27:47 CEST 2008
If you define your functions in the loop you can it directly
since then the scoping rules work in your favor:
for(i in 1:4) {
f <- function() i*i
print(f())
}
or via lapply:
F <- function(i) { f <- function() i*i; print(f()) }
lapply(1:4, F)
Often the sort of situation you discuss is really an attempt
to use object oriented programming without realizing it.
The body of the loop is an object whose methods are the
functions. The proto package
http://r-proto.googlecode.com
can deal with such situations as can direct manipulation of
R environments or the use of function bodies as wrappers,
e.g.
demo(scoping)
On Fri, Apr 18, 2008 at 2:00 AM, Peter Waltman <peter.waltman at gmail.com> wrote:
> Hi Duncan -
>
> Thanks for the reply. Yeah, I understand what I'm doing is a bit weird, but
> I'm actually calling a few functions w/in the for-loop that need the value
> of the "i" var, and because I was a bit confused by the concept of
> environments, I was hoping to avoid having to pass it in as an arg to each
> function.
>
> Thanks,
>
> Peter
>
> On Thu, Apr 17, 2008 at 7:25 PM, Duncan Murdoch <murdoch at stats.uwo.ca>
> wrote:
>
>
> > On 17/04/2008 5:37 PM, Peter Waltman wrote:
> >
> > > Hi -
> > >
> > > I'm having a really hard time w/understanding R's get function, and
> > > would
> > > appreciate any help with this.
> > >
> > > Specifically, I'm using a for loop to call a function. I'd like the
> > > function to have access to the variable being incremented in the
> > > for-loop,
> > > i.e.
> > >
> > > t.fn <- function() return( get( "i" ) )
> > >
> > > t.fn2 <- function() {
> > > for ( i in 1:5 )
> > > cat( t.fn(), "\n" )
> > >
> > > }
> > >
> > > However, I keep getting err msg's from the 'get' function about how it
> > > can't
> > > find the 'i' variable.
> > >
> > > I've tried various combinations w/in the get fn, i.e. passing inherits=T
> > > (should be the default val according to R's help) and envir=sys.frame().
> > >
> > > As I understand it, 'get' should search the enclosing environments,
> > > which I
> > > assume would be the call-stack of the functions. If not, could someone
> > > clarify?
> > >
> >
> > The R Language manual describes this; R uses lexical scope. get() will
> > search the calling environment, and its parent -- which in your case is
> > where t.fn was defined -- and the parent of that environment, etc. The call
> > stack is not searched.
> >
> > There are ways to look up the stack; passing envir=parent.frame() to get
> > will work for your needs. But it's not a natural thing to do in R; it means
> > your t.fn wouldn't work if it was called from anywhere but t.fn2. So why
> > not define it there, and then i would be visible to it without this
> > trickery? I.e.
> >
> > t.fn2 <- function() {
> > t.fn <- function() return( i )
> > for ( i in 1:5 )
> > cat( t.fn(), "\n" )
> > }
> >
> > Duncan Murdoch
> >
> >
> > > Thanks,
> > >
> > > Peter
> > >
> > > p.s. when I define t.fn to be:
> > >
> > > t.fn<- function() {
> > > for ( j in sys.nframe():0 ) cat( j,":",ls( sys.frame( j ) ), "\n" )
> > > }
> > > and call that in t.fn2(), I do eventually see the 'i' variable, i.e.
> > >
> > > > t.fn2()
> > > >
> > > 2 : j
> > > 1 : i
> > > 0 : test t.fn t.fn2 t.fn3
> > >
> > > [[alternative HTML version deleted]]
> > >
> > > ______________________________________________
> > > 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.
> > >
> >
> >
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> 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