[R] Help with using 'get' function and variable scope

Duncan Murdoch murdoch at stats.uwo.ca
Fri Apr 18 13:49:17 CEST 2008


On 18/04/2008 7:27 AM, Gabor Grothendieck wrote:
> 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())
> }

f doesn't need to be in the loop, it just needs to be defined in the 
same environment as i was defined in.  Loops in R don't create new local 
frames.

Duncan Murdoch

> 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