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

Gabor Grothendieck
Sat, 07 Jan 2012 03:46:49 -0000

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