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

"DW" == David Winsemius <dwinsem...@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

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to