Как работает «условное или» (также называемое «короткое замыкание или»), записанное как оператор | || `в R? - PullRequest
3 голосов
/ 15 октября 2019

Итак, как «условное или» (также называемое «короткое замыкание или»), записанное как оператор ||, работает в 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 нигде?

1 Ответ

2 голосов
/ 15 октября 2019

Оператор || сравнивает только первые элементы векторов и возвращает один логический результат, тогда как | сравнивает векторы поэлементно и возвращает результат вектора. См., Например:

x <- c(FALSE, TRUE)
y <- c(FALSE, FALSE)

x | y
#> [1] FALSE  TRUE
x || y
#> [1] FALSE

На самом деле это также упоминается в цитируемом вами тексте справки: «Более длинная форма оценивается слева направо , рассматривая только первый элемент каждого вектора. » [выделение добавлено]

Создано в 2019-10-15 пакетом Представить (v0.3.0)

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