Вопрос может показаться глупым, пожалуйста, потерпите. Я хотел подтвердить, что оценивает запятая, поэтому сделал следующее.
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()
. Может ли кто-нибудь помочь мне понять?
@JonSpring, опубликуй это как ответ!
Можете ли вы рассказать немного больше о том, что, по вашему мнению, делают операторы |
и &
? Возможно, вы думаете, что &
— это intersect()
, а |
— это union()
?
Вам следует запустить c(xy, ab)
, c(xy | ab)
и c(xy & ab)
и посмотреть, что они вернут.
@BenBolker Я думаю, |
оценивается как истинное, если «любое» из выражений истинно, в то время как &
требует, чтобы «все» выражения были истинными, чтобы оно оценивалось как истинное
Я думаю, Джон Спринг уже объяснил почти все в своем превосходном комментарии. Ваша последняя команда:
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()
наши ответы, но вы опередили меня при отправке :)
Спасибо @GregorThomas – всего на 1 несколько секунд. ;)
Говоря подробнее, причина, по которой 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)
.
См.
?'|':
«Числовые и комплексные векторы будут приведены к логическим значениям, при этом ноль будет ложным, а все ненулевые значения будут истинными». Поэтому, когда вы запускаетеc(xy | ab)
, это не отличается от2|5
, которое оценивается как ИСТИНА, поэтому вы на самом деле спрашиваете с помощью3 %in% c(xy | ab)
, является ли3 %in% TRUE
ложным. Вc(xy, ab)
вы объединяетеxy
иab
, в результате чего ваши два вектора из 10 элементов образуют один вектор из 20 элементов.