Assigning to a list within a loop (PR#175)

Robert Gentleman rgentlem@hsph.harvard.edu
Thu, 22 Apr 1999 11:14:51 -0400 (EDT)



On Thu, 22 Apr 1999 wvenable@arcola.stats.adelaide.edu.au wrote:

> We noticed this bug in more complex code, but this succinctly
> describes the phenomenon.
> 
> If you do not re-initialize a each time in the following loop,
> the final value only is assigned to all places when the loop is
> complete.
> 
> > a <- b <- list()
> > for(i in 1:5) {
> +	a$alpha <- i
> +	b[[i]] <- a
> +	}
> > unlist(b)
> alpha alpha alpha alpha alpha 
>     5     5     5     5     5 
> 
> If a is re-created each time, however the correct behaviour
> happens:
> 
> 
> > b <- list()
> > for(i in 1:5) {
> +	  a <- list(alpha = i)
> +	  b[[i]] <- a
> +	  }
> > unlist(b)
> alpha alpha alpha alpha alpha 
>     1     2     3     4     5 
> 
> > version
>            _                 
> platform   i586-unknown-linux
> arch       i586              
> os         linux             
> system     i586, linux       
> status                       
> status.rev 0                 
> major      0                 
> minor      64.0              
> year       1999              
> month      April             
> day        8                 
> language   R                 
> >
> 
> Bill Venables & Berwin Turlach.
> 
  I think that worse things could happen, the problem seems to be around
 line 1486 of subassign (the first line is missing in the current source)

  1486              if( NAMED(y) ) y = duplicate(y);
  1487              VECTOR(x)[offset] = y;
  1488              break;
  1489

  I think that you need to duplicate y, and have added that line;
  but perhaps what you need to do is to increment NAMED of y(???)
  I'll commit it if Ross doesn't yell too loud

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._