[Rd] Bugs due to naive copying of list elements

David Winsemius dwinsemius at comcast.net
Tue Mar 12 18:28:44 CET 2013


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



More information about the R-devel mailing list