[R] odd feature
Duncan Murdoch
murdoch at stats.uwo.ca
Mon May 22 15:39:10 CEST 2006
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 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.
>
> 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 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
>>> >>
>>>
>
>
More information about the R-help
mailing list