# [R] else if statement error

David Winsemius dwinsemius at comcast.net
Mon Oct 5 17:33:42 CEST 2009

On Oct 5, 2009, at 5:38 AM, Martin Maechler wrote:

>>>>>> "DW" == David Winsemius <dwinsemius at comcast.net>
>>>>>>    on Sat, 3 Oct 2009 12:56:51 -0400 writes:
>
>    DW> On Oct 3, 2009, at 11:54 AM, Chen Gu wrote:
>
>>> Hello,
>>>
>>> I am doing a simple if else statement in R. But it always comes out
>>> error
>>> such as 'unexpected error'
>>> There are two variables. ini and b. when ini=1, a=3; when ini>1 and
>    b> 2,
>>> a=5; all other situations, a=6. I don't know where it is wrong.
>>> Here is my code
>>>
>>> ini=3
>>> b=4
>    DW> Your basic problem is that you are confusing if and else
> which are
>    DW> program control functions with ifelse which is designed for
> assignment
>    DW> purposes;
>
> David, not quite:  in R, "everything"(*) is a function,
> and in the example we have here
> (and innumerous similar examples)   ifelse(.) is not efficient
> to use:
>>> ini=3
>>> b=4
>>> a <-   ifelse( ini==1, 3, ifelse( ini>1 & b>2 , 5, 6))
>>>
>>> a
>> [1] 5
>
> More efficient -- and also nicer in my eyes ---
> is
> 	a <-  if(ini == 1) 3 else if(ini > 1 && b > 2) 5  else  6

No argument that is a bit more readable than my version above. I
guessed that:

a <- 6 - 3*(ini == 1) - (ini > 1 && b > 2)

... might be even more efficient, ... but 10^6 instances took almost
twice as long as the if(){}else{} construction. The if else
construction took 2e-06 seconds, the ifelse(,,) took 4.2e-05 seconds
and the Boolean math version 3.45e-06 seconds.

>
> As I say on many occasions:
>   ifelse() is useful and nice, but it is used in many more
>   places than it should.... {BTW, not only because of examples like
> the above}.

On the r-help list I see many more examples where (I thought) ifelse
should have been used. I would be interested in seeing the other
examples that you have in mind where it should not be used. On the
principle that there are no new questions on r-help anymore, perhaps a
link to a discussion from the archives could be .... more efficient?
(I did try searching and have found some interesting material, but not
on this particular point. A search for:

"if else" ifelse efficien*

came up empty when restricted to R-help.)

>
> Martin Maechler, ETH Zurich
>
> ----
> (*) "almost"
>
> --

David Winsemius, MD
Heritage Laboratories
West Hartford, CT