It does work as documented. My question was why it was designed to work
this way. I can not think of a practical situation when someone might
want to ifelse() on a 'test' that is shorter than yes/no w/o expecting
'test' to recycle (therefore I was asking for a warning).
I find this behavior inconsistent with the (spirit of) R's recycling
rules. For example if 'test', 'yes', 'no' are all of the
same length
then the following two expressions are equivalent:
1.
x <- ifelse(test, yes, no)
2.
x <- no; x[test] <- yes[test]
This equivalence breaks when 'test' is shorter than yes/no: in the
second case 'test' will be recycled. And I don't see a good reason
for
having them behave differently.
If I had to implement ifelse() I'd probably do:
ifelse2 <- function(test, yes, no) {
x <- rep(no, length.out=max(length(test), length(yes),
length(no)))
x[test] <- yes[test]
x
}
(If there is interest I can extend it to take care of NA-s and submit as
a (trivial) patch)
Here is a simple test:> ifelse2(c(TRUE, FALSE), seq(10), -seq(5))
[1] 1 -2 3 -4 5 -1 7 -3 9 -5
Maybe it will help if I tell how I stumbled upon this problem. I had two
m*n matrices, 'yes' and 'no', and a 'test' vector of
length m. I wanted
to create a m*n matrix which has 'yes' rows where test==TRUE and
'no'
rows otherwise. So I did
x <- matrix(ifelse(test, yes, no), nrow(yes), ncol(yes))
priding myself for doing it the "whole object way" ... and
'test' did
not recycle (in full accordance with the help page) w/o a warning.
Thanks,
Vadim
> -----Original Message-----
> From: Liaw, Andy [mailto:andy_liaw at merck.com]
> Sent: Thursday, May 20, 2004 2:20 PM
> To: Vadim Ogranovich; R-Help
> Subject: RE: [R] ifelse when test is shorter than yes/no
>
>
> > From: Vadim Ogranovich
> >
> > Hi,
> >
> > It turns out that the 'test' vector in ifelse(test, yes, no)
is not
> > recycled if it is shorter than the other arguments, e.g.
> >
> > > ifelse(TRUE, seq(10), -seq(10))
> > [1] 1
> >
> >
> > Is there any particular reason it is not recycled? If there is one
> > indeed a warning message might be in order when someone
> calls ifelse
> > with a shorter 'test'.
>
> ?ifelse says:
>
> Value:
>
> A vector of the same length and attributes (including class) as
> 'test' and data values from the values of 'yes' or
'no'. ...
>
> Seems to me it works as documented. Why do you expected otherwise?
>
> Andy
>
> > This is R1.8.1 on RH-7.3
> >
> > Thanks,
> > Vadim
> >
> > [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide!
> > http://www.R-project.org/posting-guide.html
> >
> >
>
>
> --------------------------------------------------------------
> ----------------
> Notice: This e-mail message, together with any attachments,
> contains information of Merck & Co., Inc. (One Merck Drive,
> Whitehouse Station, New Jersey, USA 08889), and/or its
> affiliates (which may be known outside the United States as
> Merck Frosst, Merck Sharp & Dohme or MSD and in Japan, as
> Banyu) that may be confidential, proprietary copyrighted
> and/or legally privileged. It is intended solely for the use
> of the individual or entity named on this message. If you
> are not the intended recipient, and have received this
> message in error, please notify us immediately by reply
> e-mail and then delete it from your system.
> --------------------------------------------------------------
> ----------------
>