逻辑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关于*或从逻辑到数字的转换,关于!运算符,肯定有我不理解的地方?
发布于 2019-06-15 05:45:34
注意,在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))因此,如果您只使用逻辑运算符,这大致就是您所期望的。当你将逻辑运算符和算术运算符组合在一起时,它可能会变得有点奇怪。
https://stackoverflow.com/questions/56601110
复制相似问题