[R] argh .. if/else .. why?
David Winsemius
dwinsemius at comcast.net
Mon Feb 15 17:24:24 CET 2010
On Feb 15, 2010, at 11:01 AM, hadley wickham wrote:
>> I, personally, utilize the ifelse(test,statement,statement)
>> function when possible over the methodology outlined.
>
> if + else and ifelse perform quite different tasks, and in general can
> not (and should not) be exchanged. In particular, note that for
> ifelse, "the class attribute of the result is taken from ‘test’ and
> may be inappropriate for the values selected from ‘yes’ and 'no’".
I have always been puzzled by that bit of advice/knowledge on the help
page. "test" will of necessity be of class "logical", and yet I
regularly succeed in producing numeric and character vectors with
ifelse. In fact ifelse would be rather limited in utility if it only
returned logical vectors.
> test1 <- 1:10 > 5
> yes1 <- letters[1:10]
> no1 <- LETTERS[1:10]
> ifelse(test1, yes1, no1)
[1] "A" "B" "C" "D" "E" "f" "g" "h" "i" "j"
> class( ifelse(test1, yes1, no1) )
[1] "character"
Further newbie query: I thought I had read there was also a
performance "gotcha" in that one of those constructs evaluated both
the affirmative and negative consequents, but it appears from the help
page that ifelse does not have that effect. And although that question
is not addressed in the ?Control help page, testing makes me think it
is also not true of if() {}else{}:
if (1) {print("x")} else{print("y")}
[1] "x"
--
David Winsemius, MD
Heritage Laboratories
West Hartford, CT
More information about the R-help
mailing list