[R] Lexical scoping question
Thomas Lumley
tlumley at u.washington.edu
Fri Feb 28 18:28:03 CET 2003
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.
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.
You could also do
f <- function(y) {
y
g <- function(x) x + y
g
}
but that makes less visual sense.
-thomas
More information about the R-help
mailing list