William Dunlap
2009-Jun-02 01:45 UTC
[Rd] reference counting bug: overwriting for loop 'seq' variable
It looks like the 'seq' variable to 'for' can be altered from within the loop, leading to incorrect answers. E.g., in the following I'd expect 'sum' to be 1+2=3, but R 2.10.0 (svn 48686) gives 44.5. > x = c(1,2); sum = 0; for (i in x) { x[i+1] = i + 42.5; sum = sum + i }; sum [1] 44.5 or, with a debugging cat()s, > x = c(1,2); sum = 0; for (i in x) { cat("before, i=", i, "\n"); x[i+1] = i + 42.5; cat("after, i=", i,"\n"); sum = sum + i }; sum before, i= 1 after, i= 1 before, i= 43.5 after, i= 43.5 [1] 44.5 If I force the for's 'seq' to be a copy of x by adding 0 to it, then I do get the expected answer. > x = c(1,2); sum = 0; for (i in x+0) { x[i+1] = i + 42.5; sum = sum + i }; sum bbbbb[1] 3 It looks like an error in reference counting. Bill Dunlap TIBCO Software Inc - Spotfire Division wdunlap tibco.com
Wacek Kusnierczyk
2009-Jun-02 08:04 UTC
[Rd] reference counting bug: overwriting for loop 'seq' variable
William Dunlap wrote:> It looks like the 'seq' variable to 'for' can be altered from > within the loop, leading to incorrect answers. E.g., in > the following I'd expect 'sum' to be 1+2=3, but R 2.10.0 > (svn 48686) gives 44.5. > > > x = c(1,2); sum = 0; for (i in x) { x[i+1] = i + 42.5; sum = sum + > i }; sum > [1] 44.5 > or, with a debugging cat()s, > > x = c(1,2); sum = 0; for (i in x) { cat("before, i=", i, "\n"); > x[i+1] = i + 42.5; cat("after, i=", i,"\n"); sum = sum + i }; sum > before, i= 1 > after, i= 1 > before, i= 43.5 > after, i= 43.5 > [1] 44.5 > > If I force the for's 'seq' to be a copy of x by adding 0 to it, then I > do get the expected answer. > > > x = c(1,2); sum = 0; for (i in x+0) { x[i+1] = i + 42.5; sum = sum > + i }; sum > bbbbb[1] 3 > > It looks like an error in reference counting. >indeed; seems like you've hit the issue of when r triggers data duplication and when it doesn't, discussed some time ago in the context of names() etc. consider: x = 1:2 for (i in x) x[i+1] = i-1 x # 1 0 1 y = c(1, 2) for (i in y) y[i+1] = i-1 y # -1 0 vQ
luke at stat.uiowa.edu
2009-Jun-02 15:28 UTC
[Rd] reference counting bug: overwriting for loop 'seq' variable
Thanks for the report. Should be fixed in teh devel and 2.9 branches. luke On Mon, 1 Jun 2009, William Dunlap wrote:> It looks like the 'seq' variable to 'for' can be altered from > within the loop, leading to incorrect answers. E.g., in > the following I'd expect 'sum' to be 1+2=3, but R 2.10.0 > (svn 48686) gives 44.5. > > > x = c(1,2); sum = 0; for (i in x) { x[i+1] = i + 42.5; sum = sum + > i }; sum > [1] 44.5 > or, with a debugging cat()s, > > x = c(1,2); sum = 0; for (i in x) { cat("before, i=", i, "\n"); > x[i+1] = i + 42.5; cat("after, i=", i,"\n"); sum = sum + i }; sum > before, i= 1 > after, i= 1 > before, i= 43.5 > after, i= 43.5 > [1] 44.5 > > If I force the for's 'seq' to be a copy of x by adding 0 to it, then I > do get the expected answer. > > > x = c(1,2); sum = 0; for (i in x+0) { x[i+1] = i + 42.5; sum = sum > + i }; sum > bbbbb[1] 3 > > It looks like an error in reference counting. > > Bill Dunlap > TIBCO Software Inc - Spotfire Division > wdunlap tibco.com > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >-- Luke Tierney Chair, Statistics and Actuarial Science Ralph E. Wareham Professor of Mathematical Sciences University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: luke at stat.uiowa.edu Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu