Re: [R] odd feature

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

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 <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.
>
> 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 <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
>>> >>
>>>
>
>

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 Mon May 22 23:44:38 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 - 00:10:17 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.