[R] Lexical scoping question

Robert Gentleman rgentlem at jimmy.harvard.edu
Fri Feb 28 18:22:02 CET 2003


Hi,
  it is sort of a bug (and sort of not a bug). You are getting bitten
  by lazy evaluation. The value of y is not getting evaluated until
  the second function is created and returned.

f <- function(y) {
  y
  g <- function(x) x + y
  g
}

 will give the behavior you want and I think there is a proposal to
 have a function force, force evaluation so that we have
f <- function(y) {
  force(y)
  g <- function(x) x + y
  g
}

 and no one is tempted to optimize it away....

 Best,
   Robert


On Fri, Feb 28, 2003 at 11:40:11AM -0500, 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)
> 
> ?
> 
> Thanks for help,
> Jim Rogers
> 
> James A. Rogers, Ph.D. <rogers at cantatapharm.com>
> Statistical Scientist
> Cantata Pharmaceuticals
> 3-G Gill St
> Woburn, MA  01801
> 617.225.9009
> Fax 617.225.9010
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> http://www.stat.math.ethz.ch/mailman/listinfo/r-help

-- 
+---------------------------------------------------------------------------+
| Robert Gentleman                 phone : (617) 632-5250                   |
| Associate Professor              fax:   (617)  632-2444                   |
| Department of Biostatistics      office: M1B20                            |
| Harvard School of Public Health  email: rgentlem at jimmy.dfci.harvard.edu   |
+---------------------------------------------------------------------------+




More information about the R-help mailing list