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

Gabor Grothendieck ggrothendieck at gmail.com
Sat Jan 7 16:38:18 CET 2012


On Sat, Jan 7, 2012 at 10:23 AM, Duncan Murdoch
<murdoch.duncan at gmail.com> wrote:
> On 12-01-06 10:21 PM, Rolf Turner wrote:
>>
>> On 07/01/12 15:51, R. Michael Weylandt<michael.weylandt at gmail.com>  wrote:
>>>
>>> I imagine the answer will involve lazy evaluation and require you use
>>> force() but I'm not quite qualified to pronounce and not at a computer to
>>> test.
>>
>>
>> I think you've got it;  I tried
>>
>> junk<- vector("list",4)
>> for(i in 1:4) {
>>     junk[[i]]<- eval(bquote(function(x){42 + .(force(i))*x}))
>> }
>>
>> and got the result that I wanted.  Still don't completely understand, but
>> it at least makes vague sense and makes me a bit more comfy.
>
>
> I'm not so sure.  The index in a for loop isn't supposed to be a promise.
>  To me, it looks like a bug, maybe in bquote()...
>

These two variations without bquote and the third which just replaces
for with while all (that I had previously posted) do work:

# 1
junk <- vector("list",4)
for(i in 1:4) {
	junk[[i]] <- eval(substitute(function(x) { 42 + i * x }, list(i = i)))
}
junk

# 2
junk <- vector("list",4)
for(i in 1:4) {
   junk[[i]] <- eval(parse(text = paste("function(x) { 42 +", i, "*x }")))
}
junk

# 3 - from my prior post
junk <- vector("list",4)
i <- 1
while(i <= 4) {
  junk[[i]] <- eval(bquote(function(x){42 + .(i)*x}))
  i <- i + 1
}
junk

-- 
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