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
reference counting bug: overwriting for loop 'seq' variable
3 messages · William Dunlap, Wacek Kusnierczyk, Luke Tierney
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
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