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

Gabor Grothendieck ggrothendieck at gmail.com
Sat Jan 7 04:46:49 CET 2012


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



More information about the R-help mailing list