[R] how to use if statement in function correctly

John Fox jfox at mcmaster.ca
Thu Sep 19 13:08:05 CEST 2002


Dear Petr,

The test in if isn't vectorized: When the condition is a vector, the first 
element controls the result. That's why ifelse exists -- to provide a 
vectorized conditional.

John

At 11:46 AM 9/19/2002 +0200, 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?

-----------------------------------------------------
John Fox
Department of Sociology
McMaster University
Hamilton, Ontario, Canada L8S 4M4
email: jfox at mcmaster.ca
phone: 905-525-9140x23604
web: www.socsci.mcmaster.ca/jfox
-----------------------------------------------------

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