From tlumley@u.washington.edu  Fri May  4 16:40:48 2001
From: tlumley@u.washington.edu (Thomas Lumley)
Date: Fri, 4 May 2001 08:40:48 -0700 (PDT)
Subject: [Rd] scoping error in xy.coords (PR#932)
In-Reply-To: <200105041522.RAA11759@pubhealth.ku.dk>
Message-ID: <Pine.A41.4.33.0105040829370.73704-100000@homer25.u.washington.edu>

On Fri, 4 May 2001 kjetilh@umsanet.edu.bo wrote:

> Hola!
>
> > rm(list=ls(all=TRUE))
>
> > x <- 1:20
> > y <- 1+x+rnorm(x)
>
> > xy.coords(y  ~ x,NULL)
>
> ... expected output, correct, but when called from inside lowess:
>
> >   lowess(y ~ x)
> Error in xy.coords(x, y) : x and y lengths differ


If you don't call them x and y it works
> x<-1:10
> y<-1:10
> lowess(y~x)
Error in xy.coords(x, y) : x and y lengths differ
> z<-y
> w<-x
> lowess(z~w)
$x
 [1]  1  2  3  4  5  6  7  8  9 10

$y
 [1]  1  2  3  4  5  6  7  8  9 10

The problem is that the formula is evaluated in the parent frame, where y
evaluates to NULL, and x evaluates to y~x, rather than in the global
environment where they would both evaluate to vectors.

In order to handle formulas correctly I think xy.coords needs to use the
same sort of indirect evaluation as model.frame: eg
   xy <-substitute(xy.coords(X,Y),list(X=substitute(x),Y=substitute(y)))
   xy<-eval(xy,parent.frame())
works as a replacement for the first two lines of lowess().  I hadn't
realised that xy.coords() was supposed to handle formulas, and since it
doesn't have a data= argument it can't do it very well.

This seems a bit drastic, given the number of times xy.coords is used.
Perhaps there's a simpler solution.


	-thomas

Thomas Lumley			Asst. Professor, Biostatistics
tlumley@u.washington.edu	University of Washington, Seattle
^^^^^^^^^^^^^^^^^^^^^^^^
 NOTE NEW EMAIL ADDRESS

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
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] scoping error in xy.coords (PR#932)
Thomas Lumley