[R] best practice(s) for retrieving a local variable from a closure
William Dunlap
wdunlap at tibco.com
Sat Apr 9 05:08:38 CEST 2011
> -----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