似乎逻辑 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))
因此,如果您只坚持使用逻辑运算符,这大致就是您所期望的。当你结合逻辑和算术运算符时,它可能会变得有点奇怪。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句