From Waclaw.Marcin.Kusnierczyk at idi.ntnu.no  Tue Jun  2 10:04:54 2009
From: Waclaw.Marcin.Kusnierczyk at idi.ntnu.no (Wacek Kusnierczyk)
Date: Tue, 02 Jun 2009 10:04:54 +0200
Subject: [Rd] reference counting bug: overwriting for loop 'seq' variable
In-Reply-To: <77EB52C6DD32BA4D87471DCD70C8D7000147B6C7@NA-PA-VBE03.na.tibco.com>
References: <77EB52C6DD32BA4D87471DCD70C8D7000147B6C7@NA-PA-VBE03.na.tibco.com>
Message-ID: <4A24DD26.2070904@idi.ntnu.no>

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



[Rd] reference counting bug: overwriting for loop 'seq' variable
Wacek Kusnierczyk