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

Schoenfeld, David Alan,Ph.D.,Biostatistics DSCHOENFELD at partners.org
Tue Aug 7 04:03:43 CEST 2012


Thank you both, this was very helpful.  I need to study environments more. Do either of you know a good source?
 

-----Original Message-----
From: Bert Gunter [mailto:gunter.berton at gene.com] 
Sent: Monday, August 06, 2012 6:03 PM
To: William Dunlap
Cc: Schoenfeld, David Alan,Ph.D.,Biostatistics; r-help at r-project.org
Subject: Re: [R] Force evaluation of a symbol when a function is created

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 the ...{{dropped:14}}
>>
>> ______________________________________________
>> 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.
>
> ______________________________________________
> 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.



-- 

Bert Gunter
Genentech Nonclinical Biostatistics

Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm


The information in this e-mail is intended only for the person to whom it is
addressed. If you believe this e-mail was sent to you in error and the e-mail
contains patient information, please contact the Partners Compliance HelpLine at
http://www.partners.org/complianceline . If the e-mail was sent to you in error
but does not contain patient information, please contact the sender and properly
dispose of the e-mail.



More information about the R-help mailing list