
Wow, I was aware of R's lazy evaluation but didn't realize that was the cause here. If the function, adder(), was not simple as I'd defined, I suppose I could also force the evaluation of "x" in a wrapping function before passing it to adder() as an alternative:
> adder <- function(x) function(y) x + y> plus <- Map(function(x) {force(x); adder(x)},c(one=1,two=2))> plus$one(1)[1] 2> plus$two(1)[1] 3
Thanks Gabor!

> From: ggrothendieck@gmail.com
> Date: Thu, 26 Aug 2010 00:28:34 -0400
> Subject: Re: [R] list of closures
> To: obsessively@hotmail.com
> CC: r-help@r-project.org
> 
> On Thu, Aug 26, 2010 at 12:04 AM, Stephen T. <obsessively@hotmail.com> wrote:
> >
> > Hi, I wanted to create a list of closures. When I use Map(), mapply(), lapply(), etc., to create this list, it appears that the wrong arguments are being passed to the main function. For example:
> > Main function:
> >> adder <- function(x) function(y) x + y
> > Creating list of closures with Map():
> >> plus <- Map(adder,c(one=1,two=2))> plus$one(1)[1] 3> plus$two(1)[1] 3
> > Examining what value was bound to "x":
> >> Map(function(fn) get("x",environment(fn)),plus)$one[1] 2$two[1] 2
> >
> > This is what I had expected:
> >> plus <- list(one=adder(1),two=adder(2))> plus$one(1)[1] 2> plus$two(1)[1] 3
> >> Map(function(fn) get("x",environment(fn)),plus)$one[1] 1$two[1] 2
> >
> > Anyone know what's going on? Thanks much!
> 
> R uses lazy evaluation of function arguments.  Try forcing x:
> 
> > adder <- function(x) { force(x); function(y) x + y }
> > plus <- Map(adder,c(one=1,two=2))
> > plus$one(1)
> [1] 2
> > plus$two(1)
> [1] 3
 		 	   		  
	[[alternative HTML version deleted]]

