[R] A behaviour pattern that I find mysterious.

Marc Schwartz m@rc_@chw@rtz @end|ng |rom me@com
Thu Feb 27 02:27:47 CET 2020


> On Feb 26, 2020, at 8:09 PM, Rolf Turner <r.turner using auckland.ac.nz> wrote:
> 
> 
> Consider the following:
> 
> x <- letters[1:5]
> x < 0
> 
> This gives
> 
>> [1] FALSE FALSE FALSE FALSE FALSE
> 
> which kind of makes sense, I guess, though I would a priori have expected all NAs.
> 
> But then do:
> 
> x[3] <- "*"
> x < 0
> 
> This gives
> 
>> [1] FALSE FALSE  TRUE FALSE FALSE
> 
> which puzzles me.  Why is "*" considered to be less than 0?
> 
> At one point I made the conjecture that it had something to do with the ordering of ASCII characters, but it does not seem to.  A little more investigation led me to conjecture that all ASCII characters except real-live letters and numerals come out as being less than 0.
> 
> Can anyone explain the rationale to me?  Not that it matters a damn. Just idle curiosity.
> 
> cheers,
> 
> Rolf Turner
> 

Rolf,

Does this help?

From ?"<":

"If the two arguments are atomic vectors of different types, one is coerced to the type of the other, the (decreasing) order of precedence being character, complex, numeric, integer, logical and raw."

Thus:

> c(0, x)
[1] "0" "a" "b" "*" "d" "e"

> sort(c(0, x))
[1] "*" "0" "a" "b" "d" "e"


Thus, "*" is less than "0", at least in my locale, and presumably yours, since lexical sort ordering is locale dependent.

Regards,

Marc Schwartz



More information about the R-help mailing list