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 t...{{dropped:26}}