[Rd] Bugs due to naive copying of list elements
Steven McKinney
smckinney at bccrc.ca
Tue Mar 12 19:40:27 CET 2013
Whereas
> a <- list(c(1,2),c(3,4),c(5,6))
> b <<- a[2:3]
> a[[2]][2] <- 9
> b
[[1]]
[1] 3 4
[[2]]
[1] 5 6
>
Examples such as this leave me in a cold sweat - where did I miss the documentation describing
Radford's case? Can anyone point to the documentation that describes Radford's outcome?
(It looks very lisp-like. Is it linked to R's origins in lisp?)
I get the same outcome in R-2.11.1 so it is nothing new. I can only hope I have not
set up such an effect in analysis scripts I've used to generate reproducible publication output.
Steven McKinney
________________________________________
From: r-devel-bounces at r-project.org [r-devel-bounces at r-project.org] On Behalf Of David Winsemius [dwinsemius at comcast.net]
Sent: March 12, 2013 10:28 AM
To: Radford Neal
Cc: r-devel at r-project.org
Subject: Re: [Rd] Bugs due to naive copying of list elements
On Mar 12, 2013, at 3:59 AM, Radford Neal wrote:
> Several bugs are present in R-2.15.3 and R-alpha due to
> naive copying of list elements.
>
> The bug below is due to naive copying in subset.c (with
> similar bugs for matrices and arrays):
>
> a<-list(c(1,2),c(3,4),c(5,6))
> b<-a[2:3]
> a[[2]][2]<-9
> print(b[[1]][2])
This is an example of lazy evaluation, right?
>
> Naive copying in mapply.c leads to the following bug:
>
> X<-1+1
> f<-function(a,b) X
> A<-mapply(f,c(1,2,3),c(4,5,6),SIMPLIFY=FALSE)
> print(A)
> X[1]<-99
> print(A)
>
Is this a bug in mapply()? or in print()? I thought 'print' should evaluate its argument and "force" the promise to be executed. Or does it just return the same promise as was passed to it? Compare:
X<-1+1
f<-function(a,b) X
A<-mapply(f,c(1,2,3),c(4,5,6),SIMPLIFY=FALSE)
print(A); str(A)
X[1]<-99
print(A)
Could someone could comment on what 'force' actually does. I am unclear why force(A) in the code above in the pace of str(A) did not have the effect I expected, whereas str(b) or str(A) did have that effect.
> a<-list(c(1,2),c(3,4),c(5,6))
> b<-a[2:3]; force(b)
[[1]]
[1] 3 4
[[2]]
[1] 5 6
> a[[2]][2]<-9
> print(b[[1]][2])
[1] 9
#----------
> X<-1+1
> f<-function(a,b) X
> A<-mapply(f,c(1,2,3),c(4,5,6),SIMPLIFY=FALSE)
> print(A); force(A)
[[1]]
[1] 2
[[2]]
[1] 2
[[3]]
[1] 2
[[1]]
[1] 2
[[2]]
[1] 2
[[3]]
[1] 2
> X[1]<-99
> print(A)
[[1]]
[1] 99
[[2]]
[1] 99
[[3]]
[1] 99
> Similar bugs exist in eapply, rapply, and vapply.
>
--
David Winsemius
Alameda, CA, USA
______________________________________________
R-devel at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list