[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