Thanks Bill and Gabor!

William Dunlap wrote:
-----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.

Reply via email to