[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