On Fri, 28 Feb 2003, Thomas Lumley wrote: > On Fri, 28 Feb 2003, Jim Rogers wrote: > > > Hello, > > > > Could someone please tell me what I am thinking about incorrectly: > > > > f <- function(y) { > > g <- function(x) x + y > > g > > } > > > > In the following, I get what I expect based on my understanding of > > lexical scoping: > > > > (f(1))(3) # 4 > > (f(2))(3) # 5 > > > > But now, > > > > fs <- lapply(c(1, 2), f) > > fs[[1]](3) # 5 (Why not 4 ?) > > fs[[2]](3) # 5 > > > > > > Checking the environments of these functions, I see that "y" is indeed > > bound to the value 2 in both cases: > > > > es <- lapply(fs, environment) > > ys <- lapply(es, function(env) get("y", env)) # list(2, 2) > > > > Because that's the way it works. It's a wart caused by the > interaction of lazy evaluation and lexical scoping. The problem is that > `y' is not evaluated until you actually call an element of fs.
I'd call it a three-way interaction of lazy evaluation. lexical scoping and changing variable bindings by explicit assignment by the implicit assignment done in a loop. The internal lapply actually does something a bit different but with the same effect. If the value of a variable in a deferred evaluation is going to change and you want the result of the evaluation befoe the change, then you have to force the evaluation to occur before the change. > You can do > > > force<-function(z) z > > f <- function(y) { > force(y) > g <- function(x) x + y > g > } > > which will work as you expect. IIRC Luke Tierney has added force() to > the forthcoming R1.7.0. It has been added now. luke -- Luke Tierney University of Iowa Phone: 319-335-3386 Department of Statistics and Fax: 319-335-3017 Actuarial Science 241 Schaeffer Hall email: [EMAIL PROTECTED] Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu ______________________________________________ [EMAIL PROTECTED] mailing list http://www.stat.math.ethz.ch/mailman/listinfo/r-help