On 5/22/2006 9:38 AM, Frank E Harrell Jr wrote: > Duncan Murdoch wrote: >> On 5/22/2006 3:26 AM, Martin Maechler wrote: >> >>>>>>>> "Gabor" == Gabor Grothendieck <[EMAIL PROTECTED]> >>>>>>>> on Sun, 21 May 2006 09:47:07 -0400 writes: >>> Gabor> If you know that test is a scalar >>> >>> Gabor> result <- if (test) a else b >>> >>> Gabor> will do it. >>> >>> Yes, indeed! >>> IMO, ifelse(test, a, b) is much overused where as >>> if(test) a else b is much UNDER used. >>> >>> >From some e-mail postings, and even some documents (even printed >>> books?), I get the impression that too many people think that >>> ifelse(.,.,.) is to be used as expression / function and >>> if(.) . else . only for "program flow control". >>> This leads to quite suboptimal code, and I personally use >>> if(.) . else . __as expression__ much more frequently than ifelse(.,.,.) >> >> For overuse of ifelse(), do you mean cases where test is length 1, so >> if() would work? Or are you thinking of something else? >> >> I'd also be interested in what you mean by "quite suboptimal" code. Are >> you thinking of things like >> >> if (test) >> temp <- a >> else >> temp <- b >> result <- f(temp) >> >> versus >> >> result <- f( if (test) a else b ) >> >> ? >> >> I would generally use the former, because it's easier to get the >> formatting right, and I find it easier to read. It's suboptimal in >> speed and memory use because of creating the temp variable, but in most >> cases I think that would be such a small difference that the small >> increase in readability is worthwhile. > > IMHO that approach too verbose and not more readable.
IMO terse unreadable :-) Duncan Murdoch > > Frank > >> Duncan Murdoch >> >> >>> Martin Maechler, ETH Zurich. >>> >>> Gabor> Here is another approach: >>> >>> Gabor> as.vector(test * ts(a) + (!test) * ts(b)) >>> >>> >>> >>> Gabor> On 5/21/06, ivo welch <[EMAIL PROTECTED]> wrote: >>> >> Dear R wizards: >>> >> >>> >> I just got stung by the ifelse() feature. >>> >> >>> >> > a <- 10:15 >>> >> > b <- 20:300 >>> >> > test <- 1 >>> >> > ifelse(test,a,b) >>> >> [1] 10 >>> >> >>> >> I had not realized that this was the default behavior---I had expected >>> >> 10:15. mea culpa. however, I wonder whether it would make sense to >>> >> replace ifelse with a different semantic, where if test is a single >>> >> scalar, it means what a stupid user like me would imagine. >>> >> >>> >> Aside, I like the flexibility of R, but I am not thrilled by all the >>> >> recycling rules. I either mean I want a scalar or a vector of >>> >> equal/appropriate dimension. I never want a recycle of a smaller >>> >> vector. (I do often use a recycle of a scalar.) >>> >> >>> >> regards, >>> >> >>> >> /iaw >>> >> >>> >> ______________________________________________ >>> >> [email protected] mailing list >>> >> https://stat.ethz.ch/mailman/listinfo/r-help >>> >> PLEASE do read the posting guide! >>> http://www.R-project.org/posting-guide.html >>> >> >>> > > ______________________________________________ [email protected] mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
