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