For the amusement of the listserver:

Making use of the counter-intuitive assignment properties of delayedAssign, a 
co-worked challenged me to construct a delayedAssign of 'x' that causes 'x' to 
change its value _every_ time it is evaluated. The example below does this; 
each time 'x' is evaluated it is updated to be the next value in the Fibonnacci 
sequence.
 
cmd <- parse(text=
             "delayedAssign(\"x\", {
                x <- y[1]+y[2]
                y[1] <- y[2]
                y[2] <- x
                eval(cmd)
                y[1]
              })")
y <- c(0,1)
eval(cmd)
for (i in 1:20) print(x)
[1] 1
[1] 1
[1] 2
[1] 3
[1] 5
[1] 8
[1] 13
[1] 21
[1] 34
[1] 55
[1] 89
[1] 144
[1] 233
[1] 377
[1] 610
[1] 987
[1] 1597
[1] 2584
[1] 4181
[1] 6765

Cheers, Robert

-----Original Message-----
From: r-devel-boun...@r-project.org [mailto:r-devel-boun...@r-project.org] On 
Behalf Of McGehee, Robert
Sent: Wednesday, April 25, 2012 5:19 PM
To: r-devel@r-project.org
Subject: [Rd] delayedAssign changing values

I'm not sure if this is a known peculiarity or a bug, but I stumbled across 
what I think is very odd behavior from delayedAssign. In the below example x 
switches values the first two times it is evaluated.

> delayedAssign("x", {x <- 2; x+3})
> x==x
[1] FALSE

> delayedAssign("x", {x <- 2; x+3})
> x
[1] 5
> x
[1] 2

The ?delayedAssign documentation says that "after [evaluation], the value is 
fixed and the expression will not be evaluated again." However, this appears 
not to be true. Is this a bug, or just a good way to write extremely obfuscated 
code?

Robert McGehee, CFA
Geode Capital Management, LLC
One Post Office Square, 28th Floor | Boston, MA | 02109
Direct: (617)392-8396

This e-mail, and any attachments hereto, are intended fo...{{dropped:14}}

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to