Java Mailing List Archive

http://www.r-help.com/

Home » R Help for Statistical Computing »

Re: [R] How to use current value of variable in function definition?

Nordlund, Dan (DSHS/RDA)

2009-07-02

Replies: Find Java Web Hosting

Author LoginPost Reply
Alan,

Doesn't Peter Dalgaard's response get you what you originally asked for? You said you wanted something like:

> if (1) { c <- 1; foo <- function () print(c); }
>c <- 2
>foo()

Based on Peter's email you could do

> c <- 1
> foo <- local({x <- c; function() print(x) })
> foo()
[1] 1
> c <- 2
> foo()
[1] 1

Hope this is helpful,

Dan

Daniel J. Nordlund
Washington State Department of Social and Health Services
Planning, Performance, and Accountability
Research and Data Analysis Division
Olympia, WA 98504-5204


> -----Original Message-----
> From: r-help-bounces@(protected)
> Behalf Of William Dunlap
> Sent: Thursday, July 02, 2009 2:44 PM
> To: Allan Engelhardt
> Cc: r-help@(protected)
> Subject: Re: [R] How to use current value of variable in function definition?
>
>
>
>
> ________________________________
>
>  From: Allan Engelhardt [mailto:allane@(protected)]
>  Sent: Thursday, July 02, 2009 11:12 AM
>  To: William Dunlap
>  Cc: r-help@(protected)
>  Subject: Re: [R] How to use current value of variable in
> function definition?
>
>
>  Thanks for the pointer to substitute(), William. This seems to
> work and is a little shorter than yours:
>
>  a <- 1; foo <- eval(substitute(function () print(a),
> env=list(a=a)))
>  a <- 2; foo()
>  # [1] 1
>
>  Not the clearest code I have ever seen, especially as 'foo'
> still shows 'a':
>
>  print(foo)
>  # function () a
>
>  Allan
>
>  The need for eval and the misleading printout is why I sent the
> longer version.
>  functionBody(foo) does show the right thing. One might consider
> this a bug
>  in substitute(): it does not clear out the source information
> when it works on
>  a call to function. You can add
>     attr(foo,"source")<-NULL
>  to fix up the printing.
>
>  substitute() doesn't seem to go into the default values of the
> arguments,
>  which is where one might prefer to put variables like this.
>
>  The eval() around substitute() is needed because function(z)z+1
> is a call to
>  a function called function, it is not a function until that call
> gets evaluated
>  and substitute does not evaluate its first argument).
>
>  Using local() avoids these problems.
>  Bill Dunlap
>  TIBCO Software Inc - Spotfire Division
>  wdunlap tibco.com
>
>
>
>  On 02/07/09 18:28, William Dunlap wrote:
>
>      From: r-help-bounces@(protected)
>      [mailto:r-help-bounces@(protected)
> Of Allan Engelhardt
>      Sent: Thursday, July 02, 2009 9:47 AM
>      To: r-help@(protected)
>      Subject: [R] How to use current value of
> variable in function
>      definition?
>
>      Must be the heat or something but I can't get my
> brain into gear and
>      figure out how to get something like
>
>      if (1) { c <- 1; foo <- function () print(c); }
>      c <- 2
>      foo()
>
>      to print 1, not 2. (The real life example is a
> little more
>      complex, but
>      you get the idea. I don't want the variable c
> in the function
>      definition, I want its value at that time.)
>
>      The only thing I have been able to come up with
> is something like
>
>      if (1) foo <- (function () { c <- 1;
> return(function () print(c)) })()
>      c <- 2
>      foo()
>      # [1] 1
>
>
>    You might try local(), as in
>      > c<-1 ; foo.local<-local({orig.c <- c ;
> function()orig.c})
>      > foo.local()
>      [1] 1
>      > c<-3
>      > foo.local()
>      [1] 1
>    It is possible for someone to alter the orig.c after you
> create
>    foo.local, as in
>      > assign("orig.c", 17, env=environment(foo.local))
>      > foo.local()
>      [1] 17
>    Looking at the function's code will not make it clear
> where
>    orig.c is coming from. The clue is that its environment
> is not
>    one of the standard named ones, but it given by a hex
> number.
>      > foo.local
>      function()orig.c
>      <environment: 0x02108c54>
>
>    You could also use substitute() to change the code in
> the function.
>    It can be messy to do but the resulting code may be
> clearer (although
>    it won't give a hint as to where that constant came
> from). E.g.,
>      > foo.substitute<-function()orig.c
>      > c<-1 ;
> functionBody(foo.substitute)<-do.call(substitute,
>    list(functionBody(foo.substitute), list(orig.c=c)))
>      > foo.substitute()
>      [1] 1
>      > foo.substitute
>      function ()
>      1
>
>    Bill Dunlap
>    TIBCO Software Inc - Spotfire Division
>    wdunlap tibco.com
>
>
>
>      but that just hurts. Please make the pain go
> away.
>
>      Can someone wake up my brain?
>
>      Allan.
>
>      ______________________________________________
>      R-help@(protected)
>      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.
>
>
>
>
>  [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help@(protected)
> 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.

______________________________________________
R-help@(protected)
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.
©2008 r-help.com - Jax Systems, LLC, U.S.A.