best practice(s) for retrieving a local variable from a closure
-----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