From thomas@biostat.washington.edu  Thu Oct 12 18:30:49 2000
From: thomas@biostat.washington.edu (Thomas Lumley)
Date: Thu, 12 Oct 2000 10:30:49 -0700 (PDT)
Subject: [Rd] works in R-1.1.1 but not in R-development; why?
In-Reply-To: <00101216345102.00374@ligarto>
Message-ID: <Pine.GSO.4.21.0010121016370.7271-100000@atlas.biostat.washington.edu>

On Thu, 12 Oct 2000, Ramon Diaz-Uriarte wrote:

> Dear All,
> 
> A library (PHYLOGR) that passed the usual tests in R-1.1.1 gives errors with
> R-devel; my (mis?)understanding of scoping rules is
> that it should have worked in both. The problems seem related to using the
> name of the data frame for extracting weights or subsets within a function
> call. The problems can be reproduced as follows:


There's something tricky happening with parent.frame()

lapply(1:10,function(x,y) {browser();x+y),y=1)

Browse[1]> eval(quote(parent.frame()),parent.frame())
<environment: 1004cb70>
Browse[1]> eval(quote(sys.frame(sys.parent())),parent.frame())
<environment: 1004cdc88>

so parent.frame() isn't an exact synonym for sys.frame(sys.parent()). I
think this i


There *has* also been a change in the scoping rules (only partly
deliberate) in model.frame as Peter pointed out, though I don't think it
is applying here. A formula now has an environment associated with it,
which is used as the default environment for variables not specified in
data=

If you do
  lapply(datai,function(w) model.frame(~w))
it works: the vector w is found in the environment of the anonymous
function.
If you do
  ff<- ~w
  lapply(datai,function(w) model.frame(ff))
it doesn't work, since the default environment is now the global one.

	-thomas

Thomas Lumley
Assistant Professor, Biostatistics
University of Washington, Seattle


> 
> **********************
> 
> datai <- data.frame( y = rnorm(10), x1 = rnorm(10), x2 = abs(rnorm(10)),
>                     x3 = rep(seq(1,5),2), counter = rep(c(1,2),c(5,5)))
> 
> formula <- as.formula(y ~ x1)
> 
> 
> # the following fails in R-1.2.0 but not in R-1.1.1
> # > Error in eval(expr, envir, enclos) : Object "datos" not found
> lapply(split(datai,datai$counter),
>        function(datos,formula) {lm(formula = formula, data = datos,
>                                    weights = datos$x2)},
>        formula = formula) 
> 
> 
> 
> # fails in R-1.2.0, but not in R-1.1.1
> # > Error in lm.fit(x, y, offset = offset) : 0 (non-NA) cases
> my.lm <- function(formula, data){
>     data <- data[data$x3 < 5, ]
>     lm(formula = formula, data = data, subset = data$counter == 1, weights = data$x2)
> } 
> 
> my.lm(formula, datai)
> 
> 
> 
> # In R-1.2.0 does NOT use weights (but it works in R-1.1.1)
> my.lm2 <- function(formula, data){
>     data <- data[data$x3 < 5, ]
>     lm(formula = formula, data = data, subset = counter == 1, weights = data$x2)
> #    lm(formula = formula, data = data, subset = counter == 1, weights = data$x2)$weights
> } 
> 
> my.lm2(formula, datai)
> 
> 
> ##################
> ## The following all work in both R-1.2.0 and R-1.1.1
> 
> datax <- datai[datai$x3 < 5 & datai$counter==1,]
> lm(formula, data = datax, weights = x2)
> lm(formula, data = datax, weights = datax$x2)
> lm(formula, data = datai, subset = (counter == 1 & x3 < 5), weight = x2)
> lm(formula, data = datai, subset = (datai$counter == 1 & datai$x3 < 5), weight = datai$x2)
> 
> lapply(split(datai,datai$counter),
>        function(datos,formula) {lm(formula = formula, data = datos,
>                                    weights = x2)},
>        formula = formula) 
> 
> my.lm9 <- function(formula, data){
>     data <- data[data$x3 < 5, ]
>     lm(formula = formula, data = data, weights = x2, subset = counter == 1)
> } 
> 
> my.lm9(formula, datai)
> 
>     
> 
> 
> 
> ************************
> 
> versions: 
> 
> R-1.1.1
> platform i586-pc-linux-gnu
> arch     i586
> os       linux-gnu
> system   i586, linux-gnu
> status   Patched
> major    1
> minor    1.1
> year     2000
> month    October
> day      11
> language R                                                                               
> 
> 
> 
> R-development:
> platform i586-pc-linux-gnu           
> arch     i586                        
> os       linux-gnu                   
> system   i586, linux-gnu             
> status   Under development (unstable)
> major    1                           
> minor    2.0                         
> year     2000                        
> month    10                          
> day      10                          
> language R                           
> 
> ********************
> 
> 
> 
> -- 
> Ramn Daz-Uriarte
> Triana 47
> 28016 Madrid
> Spain
> 
> email:ramon-diaz@teleline.es
> Phone: +-34-918-513-966
>        +-34-657-186-407	
> 
> 
> 
> 
> 
> 
> 
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
> 

Thomas Lumley
Assistant Professor, Biostatistics
University of Washington, Seattle


-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


[Rd] works in R-1.1.1 but not in R-development; why?
Thomas Lumley