R-арифметика не уважает логический оператор НЕ и порядок операций? - PullRequest
1 голос
/ 14 июня 2019

Похоже, что логический оператор НЕ ! имеет неинтуитивный порядок операций в арифметике:

set.seed(42)
a  <-  sample(100, 3)
b  <-  sample(100, 3)
c  <-  sample(100, 3)
l  <-  (1:3) <= 2

a * !l - b * !l + c
# 0  0 29

# same expression, but with parentheses for explicit grouping order of operations
(a * !l) - (b * !l) + c
# 74 14 43

Должно быть что-то, чего я не понимаю в операторе ! в отношении * или преобразовании из логического в числовое?

1 Ответ

2 голосов
/ 15 июня 2019

Обратите внимание, что в R оператор отрицания ! будет применяться ко всему выражению справа от оператора, пока не достигнет конца или не встретит выражение с более низким приоритетом.Это не просто отменяет самый ближайший термин.Напомним также, что 0 рассматривается как ЛОЖЬ, а любое другое число - ИСТИНА.Итак, соблюдайте

!0
# [1] TRUE
!5
# [1] FALSE
!5-5
# [1] TRUE
!5-3-2
# [1] TRUE
(!5)-3-2
# [1] -5

Итак, вы видите, что в случае !5-3-2 отрицание не происходит до тех пор, пока 5-3-2 не будет оценено.Без скобок отрицание - это самое последнее, что происходит.

Так что, когда вы пишете

a * !l - b * !l + c

, это то же самое, что

a * !(l - (b * !(l + c)))

Поскольку все операциидолжно произойти справа от отрицания, прежде чем отрицание может произойти.

Если вы хотите отрицать только l условия, вы можете сделать

a * (!l) - b * (!l) + c

Это функцияприоритет оператора в R (подробности см. на странице справки ?Syntax).Это один из последних операторов, которые будут оцениваться в данном выражении.

Обратите внимание, что & и | имеют более низкий приоритет, чем !, поэтому при выполнении

!a | !b & !c

это то же самое, что

(!a) | ((!b) & (!c))

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

...