[R] odd feature

Martin Maechler maechler at stat.math.ethz.ch
Mon May 22 15:45:13 CEST 2006


>>>>> "Gabor" == Gabor Grothendieck <ggrothendieck at gmail.com>
>>>>>     on Mon, 22 May 2006 09:31:14 -0400 writes:

    Gabor> If you don't like f(if (temp) a else b)
    Gabor> then what about

    Gabor> temp <- if (test) a else b
    Gabor> f(temp)

    Gabor> or

    Gabor> temp <- if (test)
    Gabor> a
    Gabor> else
    Gabor> b
    Gabor> f(temp)

    Gabor> I think its easier to understand if you factor the temp<- out since
    Gabor> one immediately then knows the purpose of the statement is
    Gabor> to set temp.

I strongly agree with Gabor on the above.

But, to Duncan's question: 
Yes, indeed, my main point was that people use  
ifelse(test, a, b)  also in cases where test is known to be of
length one.

BTW, the 2nd point about why I don't ``like'' ifelse() so much
is on its help page:

Both 'a' and 'b' are fully evaluated even though only one of the
two values of a[i], b[i] are used in the result.

Martin

    Gabor> On 5/22/06, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
    >> On 5/22/2006 3:26 AM, Martin Maechler wrote:
    >> >>>>>> "Gabor" == Gabor Grothendieck <ggrothendieck at gmail.com>
    >> >>>>>>     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.
    >> 
    >> 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 <ivowel at gmail.com> 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
    >> >     >>
    >> >     >> ______________________________________________
    >> >     >> R-help at stat.math.ethz.ch mailing list
    >> >     >> https://stat.ethz.ch/mailman/listinfo/r-help
    >> >     >> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
    >> >     >>
    >> >
    >> >     Gabor> ______________________________________________
    >> >     Gabor> R-help at stat.math.ethz.ch mailing list
    >> >     Gabor> https://stat.ethz.ch/mailman/listinfo/r-help
    >> >     Gabor> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
    >> >
    >> > ______________________________________________
    >> > R-help at stat.math.ethz.ch mailing list
    >> > https://stat.ethz.ch/mailman/listinfo/r-help
    >> > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
    >> 
    >> ______________________________________________
    >> R-help at stat.math.ethz.ch mailing list
    >> https://stat.ethz.ch/mailman/listinfo/r-help
    >> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
    >>



More information about the R-help mailing list