> -----Original Message----- > From: r-help-boun...@r-project.org > [mailto:r-help-boun...@r-project.org] On Behalf Of Benjamin Tyner > Sent: Friday, April 08, 2011 6:48 PM > To: r-help@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@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.