[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