Итак, как «условное или» (также называемое «короткое замыкание или»), записанное как оператор ||
, работает в R?
Запрос ?Logic
показывает:
& и && указывают на логическое И и |и ||указать логическое ИЛИ. Более короткая форма выполняет поэлементное сравнение во многом так же, как арифметические операторы. Более длинная форма оценивает слева направо, рассматривая только первый элемент каждого вектора. Оценка продолжается только до определения результата. Более длинная форма подходит для программирования потока управления и обычно предпочтительнее в предложениях if.
Стандарт звуков.
> library(dplyr)
> as_tibble(mtcars) %>% filter(between(hp,50,70))
# A tibble: 5 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
2 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
3 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
4 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
5 27.3 4 79 66 4.08 1.94 18.9 1 1 4 1
Ok.
> as_tibble(mtcars) %>% filter(between(hp,80,90))
# A tibble: 0 x 11
# … with 11 variables: mpg <dbl>, cyl <dbl>, disp <dbl>, hp <dbl>, drat <dbl>, ...
# carb <dbl>
Ok,Давайте попробуем стандарт или |
, что эквивалентно заданному объединению здесь:
> as_tibble(mtcars) %>% filter(between(hp,50,70) | between(hp,80,90))
# A tibble: 5 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
2 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
3 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
4 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
5 27.3 4 79 66 4.08 1.94 18.9 1 1 4 1
ОК. Давайте попробуем условное или ||
, которое должно дать тот же результат (||
никогда не должно изменять семантику, только эффективность вычислений, за исключением случая с частичной функцией и т. Д.):
> as_tibble(mtcars) %>% filter(between(hp,50,70) || between(hp,80,90))
# A tibble: 0 x 11
# … with 11 variables: mpg <dbl>, cyl <dbl>, disp <dbl>, hp <dbl>, drat <dbl>, ...
# carb <dbl>
Чтоэто странность? between(hp,50,70) || between(hp,80,90)
не дает TRUE нигде?