[R] best practice(s) for retrieving a local variable from a closure
Benjamin Tyner
btyner at gmail.com
Sat Apr 9 19:29:04 CEST 2011
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
>>
>>
More information about the R-help
mailing list