Обратите внимание, что в 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))
, так что это примерно то, что вы ожидаете, если вы просто придерживаетесь логических операторов.Возможно, это немного странно, когда вы комбинируете логические и арифметические операторы.