[R] Force evaluation of a symbol when a function is created

Bert Gunter gunter.berton at gene.com
Tue Aug 7 00:03:29 CEST 2012


Thanks to both: Cute question, clever, informative answer.

However, Bill, I don't think you **quite** answered him, although the
modification needed is completely trivial. Of course, I could never
have figured it out without your response.

Anyway, I interpret the question as asking for the function definition
to _implicitly_ pick up the value of Y at the time the function is
defined, rather than explicitly assigning it in local(). The following
are two essentially identical approaches: I prefer the second, because
it's more transparent to me, but that's just a matter of taste.

Y <- 3
F <-local({y <- Y;function(x)x*y})
G <- evalq(function(x)x*y,env=list(y=Y))

Yielding:

> Y <- 3
> F <-local({y <- Y;function(x)x*y})
> G <- evalq(function(x)x*y,env=list(y=Y))
> F(5)
[1] 15
> G(5)
[1] 15
> Y <- 2
> F(5)
[1] 15
> G(5)
[1] 15
> F <-local({y <- Y;function(x)x*y})
> G <- evalq(function(x)x*y,env=list(y=Y))
> F(5)
[1] 10
> G(5)
[1] 10

Cheers,
Bert

On Mon, Aug 6, 2012 at 2:24 PM, William Dunlap <wdunlap at tibco.com> wrote:
> You could use local(), as in
>    > F <- local({
>    +        Y <- 3
>    +        function(x) x * Y
>    +    })
>    >    F(7)
>    [1] 21
>    > Y <- 19
>    > F(5)
>   [1] 15
>
> Look into 'environments' for more.
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
>
>> -----Original Message-----
>> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
>> Of Schoenfeld, David Alan,Ph.D.,Biostatistics
>> Sent: Monday, August 06, 2012 2:08 PM
>> To: 'r-help at r-project.org'
>> Subject: [R] Force evaluation of a symbol when a function is created
>>
>>
>> I am porting a program in matlab to R,
>> The problem is that Matlab has a feature where symbols that aren't arguments are
>> evaluated immediately.
>> That is:
>> Y=3
>> F=@(x) x*Y
>>
>> Will yield a function such that F(2)=6.
>> If later say. Y=4 then F(2) will still equal 6.
>>
>> R on the other hand has lazy evaluation.
>> F<-function(x){x*Y}
>> Will do the following
>> Y=3
>> F(2)=6
>> Y=4
>> F(2)=8.
>> Does anyone know of away to defeat lazy evaluation in R so that I can easily simulate the
>> Matlab behavior.  I know that I can live without this in ordinary programming but it would
>> make my port much easier.
>>
>> Thanks.
>>
>>
>>
>>
>> The information in this e-mail is intended only for t...{{dropped:26}}



More information about the R-help mailing list