Почему R не может обрабатывать неравенства между отрицательными числами в кавычках

Это странная проблема с простым обходным путем, но мне просто любопытно, почему R ведет себя так.

> "-1"<"-2"
[1] TRUE
> -1<"-2"
[1] TRUE
> "-1"< -2
[1] TRUE
> -1< -2
[1] FALSE
> as.numeric("-1")<"-2"
[1] TRUE
> "-1"<as.numeric("-2")
[1] TRUE
> as.numeric("-1")<as.numeric("-2")
[1] FALSE

Что происходит? Пожалуйста, для моего здравомыслия...

2 ответа

"Число в кавычках" - это вовсе не число, а строка символов. Эти символы отображаются с тем же рисунком на экране, что и соответствующий номер, но они принципиально не являются одним и тем же объектом.

Поведение, которое вы видите, соответствует следующему:

  • Пара чисел (numeric в R) сравнивается так, как и следовало ожидать, численно с естественным порядком. Итак, -1 <-2 действительно FALSE,
  • Пара струн (character в R) сравниваются в лексикографическом порядке, что примерно означает, что они сравниваются в алфавитном порядке, символ за символом, слева направо. Поскольку "-1" и "-2" начинаются с одного и того же символа, мы переходим ко второму, а "2" следует после "1", поэтому "-2" следует после "-1" и, следовательно, "-1" < "-2" это TRUE,
  • При сравнении объектов несовпадающих типов у вас есть два основных варианта: либо вы даете ошибку, либо конвертируете один из типов в другой, а затем возвращаетесь к двум фактам, указанным выше. R берет 2-й маршрут и выбирает конвертировать numeric в character, который объясняет результат, который вы получили выше (все ваши несоответствующие примеры дают TRUE).

Обратите внимание, что имеет больше смысла конвертировать numeric в character, а не наоборот, потому что большинство character не может быть автоматически преобразован в numeric значимым образом.

Я всегда думал, что это потому, что поведение по умолчанию состоит в том, чтобы рассматривать значения в кавычках как символы, а значения без кавычек - как двойные. Без явного объявления типов данных вы получите это:

> typeof(-1)
[1] "double"
> typeof("-1")
[1] "character"
> typeof(as.numeric("-1"))
[1] "double"

Только когда отрицательные числа заключаются в кавычки, они упорядочивают их в алфавитном порядке, потому что они являются символами.

Другие вопросы по тегам