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: ggrothendi...@gmail.com > Date: Thu, 26 Aug 2010 00:28:34 -0400 > Subject: Re: [R] list of closures > To: obsessiv...@hotmail.com > CC: r-help@r-project.org > > On Thu, Aug 26, 2010 at 12:04 AM, Stephen T. <obsessiv...@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]] ______________________________________________ R-help@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.