Запятая, И и оператор вертикальной черты "|"

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

xy <- c(1:10)
ab <- c(10, 2, 1, 6, 8, 6, 7, 2, 10, 6)

# I ran this knowing the number 3 is absent in `ab`
3 %in% c(xy, ab) # output `TRUE` so I thought it evaluates to an OR

# Ran this
3 %in% c(xy & ab) # output `FALSE` as expected

# then ran this
3 %in% c(xy | ab) # output `FALSE` then I got confused, I was expecting same output as in the comma code

Я думаю, что за это отвечает функция c(). Может ли кто-нибудь помочь мне понять?

См. ?'|': «Числовые и комплексные векторы будут приведены к логическим значениям, при этом ноль будет ложным, а все ненулевые значения будут истинными». Поэтому, когда вы запускаете c(xy | ab), это не отличается от 2|5, которое оценивается как ИСТИНА, поэтому вы на самом деле спрашиваете с помощью 3 %in% c(xy | ab), является ли 3 %in% TRUE ложным. В c(xy, ab) вы объединяете xy и ab, в результате чего ваши два вектора из 10 элементов образуют один вектор из 20 элементов.

Jon Spring 12.07.2024 02:35

@JonSpring, опубликуй это как ответ!

Ben Bolker 12.07.2024 02:42

Можете ли вы рассказать немного больше о том, что, по вашему мнению, делают операторы | и &? Возможно, вы думаете, что & — это intersect(), а | — это union()?

Ben Bolker 12.07.2024 02:42

Вам следует запустить c(xy, ab), c(xy | ab) и c(xy & ab) и посмотреть, что они вернут.

Edward 12.07.2024 02:46

@BenBolker Я думаю, | оценивается как истинное, если «любое» из выражений истинно, в то время как & требует, чтобы «все» выражения были истинными, чтобы оно оценивалось как истинное

blessingAlabi 12.07.2024 02:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, Джон Спринг уже объяснил почти все в своем превосходном комментарии. Ваша последняя команда:

3 %in% c(xy | ab) # output `FALSE`

возвращает FALSE и было для вас неожиданностью, я думаю, потому что вы, возможно, ошибочно предположили, что команда гласит: «Число 3 находится в xy или в ab? Это будет записано в коде R как:

(3 %in% xy) | (3 %in% ab)

который возвращает TRUE (ваше ожидание).

Проблема здесь в том, что xy | ab оценивается первым и возвращает вектор длины 10, все из которых имеют значение ИСТИНА. Затем R определяет, находится ли 3 в этом векторе, и возвращает FALSE.

Вы можете сначала объединить xy и ab, используя c() без OR:

## these are equivalent to `3 %in% xy | 3 %in% ab`
3 %in% c(xy, ab)
3 %in% union(xy, ab)

Но это работает только потому, что вы проверяете членство в наборе.

Я пытался отредактировать union() наши ответы, но вы опередили меня при отправке :)

Gregor Thomas 12.07.2024 04:26

Спасибо @GregorThomas – всего на 1 несколько секунд. ;)

Edward 12.07.2024 04:30

Говоря подробнее, причина, по которой xy | ab оценивается как вектор из 10 значений ИСТИНА, заключается в том, что | будет проходить через каждый элемент каждого вектора, сравнивая его с соответствующим элементом другого вектора, и сообщать ИСТИНА, если хотя бы один из двух элементов правда. Ненулевые числа будут преобразованы в TRUE, поэтому xy | ab эквивалентно c(1|10, 2|2, 3|1, ... etc), что приводит к c(TRUE|TRUE, TRUE|TRUE, TRUE|TRUE ... etc.), что эквивалентно c(TRUE, TRUE, TRUE ... etc).

Jon Spring 12.07.2024 05:42

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