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))
所以如果您坚持使用逻辑运算符,这大致就是您所期望的。当您组合逻辑和算术运算符时,它可能会变得有点奇怪。
似乎逻辑 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))
所以如果您坚持使用逻辑运算符,这大致就是您所期望的。当您组合逻辑和算术运算符时,它可能会变得有点奇怪。