[R] odd feature

Duncan Murdoch murdoch at stats.uwo.ca
Mon May 22 13:41:10 CEST 2006


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



More information about the R-help mailing list