By the way, seq() is a function. May be it is not a interesting name for object name :-) milton
On Wed, Jun 17, 2009 at 11:40 PM, Duncan Murdoch <murd...@stats.uwo.ca>wrote: > Liaw, Andy wrote: > >> A colleague and I were trying to understand all the possible things one >> can do with for loops in R, and found some surprises. I think we've >> done sufficient detective work to have a good guess as to what's going >> on "underneath", but it would be nice to get some confirmation, and >> better yet, perhaps documentation in the R-lang manual. Basically, the >> question is, how/what does R do with the loop index variable? Below are >> some examples: >> >> > > I think it is documented in the ?Control topic that a copy of the seq > argument (the 1:2 in your first example) is made at the beginning, and that > altering var (your i) doesn't affect the loop. One other thing you didn't > investigate is what is the value of an expression like > > loopval <- for (i in 1:2) { i } > > This sets loopval to 2, but in R-devel (2.10.0 to be) this has changed: > loops now have NULL as their value. > > > > R> for (i in 1:2) { i <- 17; print(i) } >> [1] 17 >> [1] 17 >> R> print(i) >> [1] 17 >> R> x <- 1:2 >> R> for (i in x) { print(i); rm(i) } >> [1] 1 >> [1] 2 >> R> i >> Error: object 'i' not found >> R> for (i in x) { print(i); rm(x) } >> [1] 1 >> [1] 2 >> Warning message: >> In rm(x) : object 'x' not found >> R> i >> [1] 2 >> R> x <- 1:2 >> R> for (i in x) { print(i); i <- 17; print(i) } >> [1] 1 >> [1] 17 >> [1] 2 >> [1] 17 >> >> The guess is that at the beginning for the loop, R makes a copy of the >> object that's being looped over ("x" in examples above) somewhere "under >> cover", and at the beginning of each iteration, assign the "current" >> element to the index variable ("I" in the examples above). This is the >> only logical explanation I can come up with given the behavior observed >> above. Can anyone confirm/deny this? If this is true, one thing to >> consider is not to use a large object to loop over (e.g., columns of a >> very large data frame). >> >> > > It is uncommon to modify seq (your x) in the loop. In the usual case where > you don't modify it, the fact that the loop has made a copy should not > matter: R won't actually copy the complete object until one version of it > is changed. > > So this sequence > > seq <- data.frame(a=1:1000000, b=1:1000000) > for (var in seq) { print(var[1]) } > > hardly uses any more memory during the loop than it used in creating seq, > but this sequence > > for (var in seq) { seq$b[1] <- -1; print(var[1]) } > > uses a lot more: seq is modified so a copy is made, and seq$b is modified > after var is set to it, so a copy is made of that too. Both of the loops > print two 1's, by the way. > > Duncan Murdoch > >> Andy >> > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html<http://www.r-project.org/posting-guide.html> > and provide commented, minimal, self-contained, reproducible code. > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.