[R] argh .. if/else .. why?

Peter Dalgaard P.Dalgaard at biostat.ku.dk
Tue Feb 16 10:33:26 CET 2010


Gabor Grothendieck wrote:
> On Mon, Feb 15, 2010 at 11:24 AM, David Winsemius
> <dwinsemius at comcast.net> wrote:
>> 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.
>>
> 
> I think it had intended to refer to oldClass rather than class.
> 
>> oldClass(TRUE)
> NULL
>> oldClass(ifelse(TRUE, 1, 2))
> NULL

Well, it does date back to S v.3, but the docs do say class _attribute_
and "logical" & friends aren't. It happens with all attributes, and I
suspect that the original intention was for things like this to work

> ifelse(matrix(c(T,T,F,F),2),1,2)
     [,1] [,2]
[1,]    1    2
[2,]    1    2

I can't think of a situation where it is actually useful to copy the
class attribute from the condition to the result. Presumably, the idea
is that of the three possibilities, only the condition attributes are
unambiguous (think if(cond, A, B) vs. if(!cond, B, A)), so if any set of
attributes should be copied, those are the ones.

-- 
   O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)              FAX: (+45) 35327907



More information about the R-help mailing list