[R] Help with using 'get' function and variable scope
Duncan Murdoch
murdoch at stats.uwo.ca
Fri Apr 18 01:25:00 CEST 2008
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.
More information about the R-help
mailing list