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

时间:2019-06-14 15:21:11

标签: r math arithmetic-expressions

似乎逻辑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

关于!*的运算符或从逻辑到数字的转换,我肯定不了解吗?

1 个答案:

答案 0 :(得分:2)

请注意,在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))

因此,如果您只是坚持使用逻辑运算符,这大致就是您所期望的。也许当您将逻辑运算符和算术运算符结合使用时,它会变得有些奇怪。