[R] How to avoid ifelse statement converting factor to character

Craig P. Pyrame crappyr at gmail.com
Fri Jun 26 12:49:03 CEST 2009


Stavros Macrakis wrote:
> On Thu, Jun 25, 2009 at 12:47 PM, Craig P. Pyrame<crappyr at gmail.com> wrote:
>   
>> The man page Stavros quotes states that the class attribute of the result is
>> taken from 'test', which clearly is not the case:
>>     
>
> Actually, the behavior is documented pretty clearly:
>
>      The mode of the answer will be coerced from logical to
>      accommodate first any values taken from 'yes' and then
>      any values taken from 'no'.
>
> Whether this is a good design or not is another issue....  Perhaps the
> justification is that it avoids evaluating the yes or no arguments (to
> determine their class) in cases where their value is not needed.
>   

Thank you for pointing me to this.  Now I get a headache from trying to 
figure out what does mode have to do with class - I thought that the 
class of the result should be that of test, and that the mode is 
something entirely different.  Why does coercing the mode also affect 
the class?  If the man page said "The class attribute is taken from 
test, and it will be coerced ..." or "The mode of the result is taken 
from test, and it will be coreced ...", would this be wrong?  What is 
the class-mode mixture about?

Why does this fail:

 > r = as.raw(TRUE)
 > ifelse(TRUE, r, r) => error

This gives an error which I take for saying that raw cannot be coerced 
to logical, but yes it can:

 > as.logical(r) => TRUE

and raw can even be used as the condition vector in ifelse:

 > ifelse(r, 1, 2) => 1

Best regards,
Craig


> Example:
>
>      ifelse(c(T,F),1,"a") => c("1","a")
>
> This has the same effect as
>
>     res <- c(T,F)
>     res[1] <- 1
>     res[2] <- "a"
>
> which is in fact pretty much the way it is implemented.
>
>   
>> And also, I find myself incapable of making sense of the "may" in "the mode
>> of the result may depend on the value of 'test'" - may in what sense?
>>     
>
> See the examples at the end of ? ifelse
>
>          -s
>




More information about the R-help mailing list