R- 算术不遵守逻辑 NOT 运算符和运算顺序?

R- arithmetic does not respect logical NOT operator and order of operations?

似乎逻辑 NOT 运算符 ! 在算术运算中具有非直观的运算顺序:

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

关于 ! 运算符与 * 或从逻辑到数字的转换,一定有一些我不明白的地方?

请注意,在 R 中,否定运算符 ! 将应用于运算符右侧的整个表达式,直到它到达末尾或遇到优先级较低的表达式。它不仅否定最直接的术语。还记得 0 被视为 FALSE,任何其他数字都被视为 TRUE。所以观察

!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))

所以如果您坚持使用逻辑运算符,这大致就是您所期望的。当您组合逻辑和算术运算符时,它可能会变得有点奇怪。