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

On 02/07/09 18:28, William Dunlap wrote:
>> From: r-help-boun...@r-project.org
>> [mailto:r-help-boun...@r-project.org] On Behalf Of Allan Engelhardt
>> Sent: Thursday, July 02, 2009 9:47 AM
>> To: r-help@r-project.org
>> 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@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.
>>
>>      

        [[alternative HTML version deleted]]

______________________________________________
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