似乎逻辑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
关于!
与*
的运算符或从逻辑到数字的转换,我肯定不了解吗?
答案 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))
因此,如果您只是坚持使用逻辑运算符,这大致就是您所期望的。也许当您将逻辑运算符和算术运算符结合使用时,它会变得有些奇怪。