Re: [R] best practice(s) for retrieving a local variable from a closure

From: Benjamin Tyner <btyner_at_gmail.com>
Date: Sat, 09 Apr 2011 13:29:04 -0400

Thanks Bill and Gabor!

William Dunlap wrote:
>> -----Original Message-----
>> From: r-help-bounces_at_r-project.org
>> [mailto:r-help-bounces_at_r-project.org] On Behalf Of Benjamin Tyner
>> Sent: Friday, April 08, 2011 6:48 PM
>> To: r-help_at_r-project.org
>> Subject: [R] best practice(s) for retrieving a local variable
>> from a closure
>>
>> Greetings,
>>
>> Say I have defined
>>
>> mp <- function(a) function(x) x^a
>>
>> f2 <- mp(2)
>>
>> and I would like to retrieve the "a" which is local to f2.
>> Two options
>> come to mind;
>>
>> get("a", envir=environment(f2))
>> eval(substitute(a), environment(f2))
>>
>> I'm curious if one of these is preferred over the other in terms of
>> efficiency, robustness, aesthetics, etc. Or perhaps someone can share
>> another way to skin this cat, besides wrappers around eval() like
>>
>> evalq(a, environment(f2))
>> with(environment(f2), a)
>>
>
> You can also use a list-like notation with environments:
> > environment(f2)$a
> [1] 2
> > environment(f2)[["a"]]
> [1] 2
> > environment(f2)$a <- 3:1
> > f2(2)
> [1] 8 4 2
>
> The above feels a bit like snooping where I wasn't invited.
> You could do something like
> mq <- function(a) {
> force(a)
> list(getA = function()a,
> setA = function(newA) a <<- newA,
> fun = function(x)x^a
> )
> }
> to make it clear that you expect people to look at or change
> fun's 'a'.
> > f3 <- mq(3)
> > f3$fun(5)
> [1] 125
> > f3$getA()
> [1] 3
> > f3$setA(4:1)
> > f3$fun(3)
> [1] 81 27 9 3
>
> I don't code like this much so haven't developed a sense of
> aesthetics about these variants.
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
>
>> Also, I'd like to confirm that I have used the correct terminology in
>> the subject line, that "a" is a local variable with respect
>> to f2, which
>> is a closure?
>>
>> Thanks,
>> Ben
>>
>>



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. Received on Sat 09 Apr 2011 - 17:33:55 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 09 Apr 2011 - 19:50:30 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive