Поведение символов с реляционными операторами - PullRequest
0 голосов
/ 10 декабря 2018

Может кто-нибудь объяснить, почему R делает это?И причина этого?

"-1" < 0
#[1] TRUE
# expected [1] FALSE # OR better NA

"-abc" < 0
#[1] TRUE
# expected [1] FALSE # OR better NA

От ?Comparison:

Если два аргумента являются атомными векторами разных типов, один приводится к типу другого,(убывающий) порядок старшинства: символ, комплекс, число, целое, логическое и необработанное

Это также не помогает. FWIW:

toString(-1) < 0
as.character(-1) < 0
toString("-abc") < 0
as.character("-abc") < 0

Неправда ли ядругой результат?Я спрашиваю об этом, потому что мне кажется, что это может дать неожиданные результаты внутри функции, если она неизвестна.

1 Ответ

0 голосов
/ 10 декабря 2018

Чтобы процитировать правила предшествования, которые вы уже процитировали:

(убывающий) порядок приоритета, который является символьным, сложным, числовым, целым, логическим и необработанным

Итакв выражении:

"-abc" < 0

происходит то, что 0 на RHS приводится к символу.Это оставляет нам:

"-abc" < "0"

Это лексикографически верно (вы можете проверить сами).Таким образом, выражение оценивается как истинное.Обратите внимание, что если бы приведение пошло другим путем, а именно, если бы R попытался привести "-abc" к числовому типу, то это привело бы к NA, и все выражение могло бы быть оценено как NA, not true:

"-abc" < 0
NA < 0
NA

Итак, вот как мы знаем, что R приводит RHS к символу.

Хорошее эмпирическое правило в R (или SQL, JavaJavaScript, действительно любой язык), чтобы не возиться с типами.Если вы знаете, что ваши данные являются числовыми, то работайте с числовым типом и рассматривайте его как таковой, как наоборот для символьных данных.

...