Re: [R] best practice(s) for retrieving a local variable from a closure

From: William Dunlap <wdunlap_at_tibco.com>
Date: Fri, 08 Apr 2011 20:08:38 -0700

> -----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
>



R-help_at_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. Received on Sat 09 Apr 2011 - 03:11:37 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 09 Apr 2011 - 18:00:29 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive