Почему as.numeric (1) == (3 | 4) имеет значение TRUE? - PullRequest
0 голосов
/ 04 июня 2018

Я хотел сделать простое сравнение, используя h == 1 | 2, где h может быть целым числом от 1 до 4. К моему удивлению, это не сработало.

Я мог как-то понять, почему

1 == 2 |4

ИСТИНА

и, возможно, даже почему

1 == (2 | 4)

ИСТИНА

но почему во имя всего разумного и вменяемого делает

as.numeric (1) == (2 | 4)

или

1L == (2 | 4)

или

3 == 2 |4

оценка

ИСТИНА

???

Как я могу попросить R сказать мне, 1 is equal to 2 or 4 и ответ будет FALSE?

Ответы [ 3 ]

0 голосов
/ 04 июня 2018
1 == 2 | 4

Приоритет оператора говорит нам, что это эквивалентно (1 == 2) | 4

1 == 2 равно FALSE, 4 приводится к логическому (поскольку | является логическимоператор), as.logical(4) - это TRUE, поэтому у вас есть FALSE | TRUE, то есть TRUE

Действительно правила приведения для логических операторов (?Logic) говорят нам, что:

Числовые и комплексные векторы будут приведены к логическим значениям, при этом ноль будет ложным, а все ненулевые значения будут истинными.


3 == 2 | 4

То же самое


1 == (2 | 4)

2 | 4 будет приведено к TRUE | TRUE, что составляет TRUE.Затем 1 == TRUE приводится к 1 == 1, что составляет TRUE.

Действительно правила приведения для операторов сравнения (?Comparison) говорят нам, что:

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


as.numeric(1) == (2 | 4)

То же самое


1L == (2 | 4)

То же самое снова


1 равно 2 или 4

на самом деле (1 равно 2) или (1 равно 4), что:

(1==2)|(1==4)

, что составляет

FALSE | FALSE

, что составляет FALSE

0 голосов
/ 04 июня 2018

Код, который доставит ожидаемый ответ на неявный вопрос в вашем первом предложении:

1 %in% 2:4
[1] FALSE

h=1
h %in% 1:2
[1] TRUE

Оператор "==" неявно генерирует диапазон (или вектор альтернатив) излогическое соединение.Он считается «оператором сравнения» и является «универсальным», что означает, что методы могут быть разными для разных типов данных.Они также векторизованы (с действующими неявными правилами повторного использования), поэтому могут возвращать много значений:

(1:2) == (1:4)
[1]  TRUE  TRUE FALSE FALSE

И функция as.numeric(), примененная к значению 1, будет возвращать именно ввод.

Дальнейший комментарий: Поскольку ваша попытка использовать "==" действительно была неявной операцией над множеством, вы можете просмотреть страницу справки для ?intersect.Существуют также пакеты, которые обрабатывают более сложные функции множеств.

Приведение R может идти вперед и назад между логическим и числовым в зависимости от того, как определены функции:

sum( letters[1:10] %in% letters)
[1] 10

sum( letters[1:10] == letters)
[1] 10
Warning message:
In letters[1:10] == letters :
  longer object length is not a multiple of shorter object length
0 голосов
/ 04 июня 2018

Запуск 2|4 оценивается как TRUE.Вот почему вы получаете TRUE при сравнении 1 == TRUE.То, что вы хотите оценить, это (1 == 2) | (1 == 4), что приводит к желаемому FALSE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...