[R] how to use if statement in function correctly

Uwe Ligges ligges at statistik.uni-dortmund.de
Thu Sep 19 14:38:57 CEST 2002



Petr Pikal wrote:
> 
> Dear all
> 
> I try to persuade if statement in my function to work as I want (but I am not very
> successful:(
> 
> My question is why my function with if statement is evaluated correctly in case of
> atomic variables and incorrectly in case of vector variables.
> 
> Here is an example:
> 
> #function with if statement
> 
> fff <- function(otac,sklon)
> {
> test <- (otac * 3.69683+286.6*(1/sklon)-0.03100345*otac*sklon)
> if(test<65)
> {otac/sklon * 141.76}
> else
> {otac * 3.69683+286.6*(1/sklon)-0.03100345*otac*sklon}
> }
> 
> > fff(20,70)
> [1] 40.50286
> # correct
> 
> > fff(50,70)
> [1] 80.42371
> #correct
> 
> > fff(seq(20,50,5),70)
> [1]  40.50286  50.62857  60.75429  70.88000  81.00571  91.13143 101.25714
> #wrong
> -----------------------------------------------------------------------------------------------
> It does not work because if statement is obviously evaluated as TRUE in all
> instances and computes wrongly some items in vector according to the first part
> of the fff function
> 
> # see direct computation
> > seq(20,50,5)/70*141.76
> [1]  40.50286  50.62857  60.75429  70.88000  81.00571  91.13143 101.25714
> 
> > seq(20,50,5) * 3.69683+286.6*(1/70)-0.03100345*seq(20,50,5)*70
> [1] 34.62606 42.25900 49.89194 57.52488 65.15783 72.79077 80.42371
> 
> On the other hand ifelse works
> ******************************
> fff <- function(otac,sklon)
> {
> test <- (otac * 3.69683+286.6*(1/sklon)-0.03100345*otac*sklon)
> ifelse(test<65, (otac/sklon * 141.76),  (otac * 3.69683+286.6*(1/sklon)-
> 0.03100345*otac*sklon))
> }
> 
> > fff(seq(20,50,5),70)
> [1] 40.50286 50.62857 60.75429 70.88000 65.15783 72.79077 80.42371
> #correct
> 
> Can anybody help?

For the if(){} else{} behaviour see the manual "R Language Definition",
section 3.2.1:

if(stat1){stat2} else{stat3} is expected to use only  eval(stat1)[1]  to
decide whether  stat2  or  stat3  should be evaluated next, while
ifelse() is expected to work vectorized.

Uwe Ligges
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list