[R] Putting an index explicitly into function code --- a curiosity.

R. Michael Weylandt michael.weylandt at gmail.com
Sat Jan 7 05:13:10 CET 2012


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
<ggrothendieck at gmail.com> wrote:
> On Fri, Jan 6, 2012 at 9:43 PM, Rolf Turner <rolf.turner at 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 at 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.



More information about the R-help mailing list