Presumably because the i <= 4 has to be re-evaluated at the start of each iteration of the while-loop which implicitly force()s it?
Though, I don't know if it might not be a bad idea to put an implicit force() in the internal code for `for` to prevent these sorts of things. I can't immediately think of a scenario where this sort of behavior would be useful. It might also simplify the internals to pass a value rather than what I presume is actually a promise (but I haven't looked yet and I'm still not in a position to verify) Are there scenarios where this sort of behavior is preferable for a loop (I understand the pros of lazy evaluation in general) Michael On Fri, Jan 6, 2012 at 9:46 PM, Gabor Grothendieck <ggrothendi...@gmail.com> wrote: > On Fri, Jan 6, 2012 at 9:43 PM, Rolf Turner <rolf.tur...@xtra.co.nz> wrote: >> >> I want to create a list of functions in a for loop, with the index >> of the loop appearing explicitly in the function code. >> >> After quite a bit of thrashing around I figured out how to do it. >> >> Here is a toy example: >> >> junk <- vector("list",4) >> for(i in 1:4) { >> itmp <- i >> junk[[i]] <- eval(bquote(function(x){42 + .(itmp)*x})) >> } >> >> So I'm *basically* happy, but there's something I don't understand: >> Why do I need "itmp"? >> >> That is, if I do >> >> junk <- vector("list",4) >> for(i in 1:4) { >> junk[[i]] <- eval(bquote(function(x){42 + .(i)*x})) >> } >> >> then every entry of "junk" is equal to >> >> function (x) >> { >> 42 + 4L * x >> } >> >> i.e. I seem to get the *last* value of the index always substituted, rather >> than >> the "current" value. Something (subtle?) is going on that I don't >> understand. >> And than makes me feel not quite comfy. Can anyone enlighten me? > > This seems quite strange. For example, if we replace the for with a > while then we don't need to force i: > > junk <- vector("list",4) > i <- 1 > while(i <= 4) { > junk[[i]] <- eval(bquote(function(x){42 + .(i)*x})) > i <- i + 1 > } > junk > > I am using: >> R.version.string > [1] "R version 2.14.1 Patched (2011-12-26 r58001)" >> win.version() > [1] "Windows Vista (build 6002) Service Pack 2" > > > -- > Statistics & Software Consulting > GKX Group, GKX Associates Inc. > tel: 1-877-GKX-GROUP > email: ggrothendieck at gmail.com > > ______________________________________________ > 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. ______________________________________________ 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.