[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
More information about the R-help
mailing list