[Rd] delayedAssign changing values

McGehee, Robert Robert.McGehee at geodecapital.com
Thu Apr 26 16:35:06 CEST 2012


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-bounces at r-project.org [mailto:r-devel-bounces at r-project.org] On Behalf Of McGehee, Robert
Sent: Wednesday, April 25, 2012 5:19 PM
To: r-devel at 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 at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list