[R] how to use if statement in function correctly

Petr Pikal petr.pikal at precheza.cz
Thu Sep 19 11:46:28 CEST 2002


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?

Thank you in advance
Petr Pikal
petr.pikal at precheza.cz
p.pik at volny.cz


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