From murdoch at stats.uwo.ca  Mon Jun  5 13:43:20 2006
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Mon, 05 Jun 2006 07:43:20 -0400
Subject: [Rd] xy.coords(MATRIX) bug in code or documentation (PR#8937)
In-Reply-To: <20060605093057.288701905F@slim.kubism.ku.dk>
References: <20060605093057.288701905F@slim.kubism.ku.dk>
Message-ID: <448418D8.2010202@stats.uwo.ca>

On 6/5/2006 5:30 AM, maechler at stat.math.ethz.ch wrote:
>>>>>> "FrPi" == Fran?ois Pinard <pinard at iro.umontreal.ca>
>>>>>>     on Sun,  4 Jun 2006 06:27:53 +0200 (CEST) writes:
> 
>     FrPi> Hi, people.
>     FrPi> xy.coords() does not behave like its documentation says, when given some
>     FrPi> matrices.   ?xy.coords says:
> 
>     FrPi> If 'y' is 'NULL' and 'x' is a [...] formula [...] list [...]
>     FrPi> time series [...] matrix with two columns [...]
> 
>     FrPi> In any other case, the 'x' argument is coerced to a vector and
>     FrPi> returned as *y* component [...]
> 
>     FrPi> Now, consider this short transcript:
> 
>     FrPi> ======================================================================>
>     >> as.vector(rbind(1, 2, 3))
>     FrPi> [1] 1 2 3
>     >> as.vector(cbind(1, 2, 3))
>     FrPi> [1] 1 2 3
>     >> xy.coords(rbind(1, 2, 3))
>     FrPi> $x
>     FrPi> [1] 1 2 3
> 
>     FrPi> $y
>     FrPi> [1] 1 2 3
> 
>     FrPi> $xlab
>     FrPi> [1] "Index"
> 
>     FrPi> $ylab
>     FrPi> NULL
> 
>     >> xy.coords(cbind(1, 2, 3))
>     FrPi> $x
>     FrPi> [1] 1
> 
>     FrPi> $y
>     FrPi> [1] 2
> 
>     FrPi> $xlab
>     FrPi> [1] "[,1]"
> 
>     FrPi> $ylab
>     FrPi> [1] "[,2]"
> 
>     FrPi> ======================================================================<
> 
>     FrPi> A 3 x 1 matrix and a 1 x 3 matrix both fall in the "In
>     FrPi> any other case" category, but it seems that only the 3 x 1
>     FrPi> is really "coerced to a vector".
> 
> yes. So you are right: There's a bug
> 
>     FrPi> The R code for xy.coord() suggests that the documentation should read
>     FrPi> "matrix with at least two columns" instead of "matrix with two columns".
> 
>     FrPi> As a user, I was really expecting the coercion to a
>     FrPi> vector to happen.  What triggered me into exploring
>     FrPi> this problem is the fact that plot() showed a single
>     FrPi> point where I was expecting many.  If you decide that
>     FrPi> the code is right and the documentation is wrong, then
>     FrPi> I would suggest that the code be a bit more friendly,
>     FrPi> by at least issuing some warning if more than two
>     FrPi> columns are given to a matrix.
> 
> I agree.  
> 
> I'm not sure what the change should be -- and am asking for useR
> feedback here :
> 
> 1) give an error in the case of a matrix (or data.frame) with '> 2' columns
> 2) give a warning, and use the first 2 columns -- as it happens now
> 3) silently coerce to vector -- as the current documentation claims.
> 
> The most clean would be "1)", but given back compatibility, etc,
> my tendency would go into the direction of "2)".

I think the current behaviour is reasonable, and shouldn't lead to 
warnings when executed.  If you meant a warning in the man page, that 
would be fine.	

I'm not so sure about some undocumented behaviour for formulas:

x <- 1:10
y <- 11:20
z <- 21:30
xy.coords(y ~ x+z)

will set the x column to the sum of x+z.  That's not the usual way 
formulas are handled.  I'd be happier with picking out one column, or 
generating an error, instead.

I think the error message might have been the intention, because there's 
a test

  if (inherits(x, "formula") && length(x) == 3)

but length(y ~ x+z) is 3.  I think the test should be

  if (inherits(x, "formula") && length(x) == 3 && length(x[[2]]) == 1 && 
length(x[[3]]) == 1)

Duncan Murdoch
> 
> 
>     FrPi> Another problem in the same area: the documentation lies about how the
>     FrPi> function acts when given a data.frame.  From the code, a data.frame is
>     FrPi> processed as if it was a matrix.  From the documentation, while the
>     FrPi> data.frame is not mentioned explicitely, it is implied in the paragraph
>     FrPi> explaining how a list is processed (because a data.frame is a list).
>     FrPi> Some reconciliation is needed here as well.
> 
> Yes; in this case, I propose to just amend the documentation
> explainining that data.frames are treated "as matrices".
> 
> Thanks a lot, Francois, for your careful reading and
> careful report!
>    [ Though I do slightly mind the word "lies" since
>      I do value the 9th commandment..
>      Not telling the truth *accidentally* is not "lying" ] 
> 
> Martin Maechler, ETH Zurich
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] xy.coords(MATRIX) bug in code or documentation (PR#8937)
Duncan Murdoch