Re: [R] odd feature

From: Duncan Murdoch <murdoch_at_stats.uwo.ca>
Date: Mon 22 May 2006 - 21:41:10 EST

On 5/22/2006 3:26 AM, Martin Maechler wrote:

>>>>>> "Gabor" == Gabor Grothendieck <ggrothendieck@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@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@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@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@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@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 Received on Tue May 23 03:18:44 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Tue 23 May 2006 - 04:10:23 EST.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.