[R] how to use if statement in function correctly

kjetil halvorsen kjetilh at umsanet.edu.bo
Thu Sep 19 15:52:34 CEST 2002


if is not vectorized, it is for control flow in functions. Called with a
vector of truth values , it only chooses  "if" part or "else" part
according to first value in vectos:

> x <- -1:1
> x
[1] -1  0  1
> if (x < 0) "A" else "B"
[1] "A"


For vectorized computations, you need ifelse, as you have found out.

I be,.leave all this is in the help pages.

Kjetil Halvorsen


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