[R] odd feature

Frank E Harrell Jr f.harrell at vanderbilt.edu
Mon May 22 15:38:52 CEST 2006


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.

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


-- 
Frank E Harrell Jr   Professor and Chair           School of Medicine
                      Department of Biostatistics   Vanderbilt University



More information about the R-help mailing list