【问题标题】:R- arithmetic does not respect logical NOT operator and order of operations?R-算术不尊重逻辑非运算符和运算顺序?
【发布时间】:2019-10-29 06:21:09
【问题描述】:

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

关于! 运算符与* 或从逻辑到数字的转换,一定有什么我不明白的地方吗?

【问题讨论】:

  • 检查?Syntax 的运算符优先级。加/减在乘/除之前
  • 好主意@akrun,但我在?Syntax 中看不到任何有关! 运算符优先级的信息
  • 它就在那里,否定运算符
  • 一直觉得(并且有一段时间,认为)否定运算符应该像否定运算符一样直接,就像本地一样可能。对我来说,贪婪的否定者的概念是……错误的。不幸的是,他们在实施时没有咨询我。 (对我来说,(!F)+5!F+5 不是同一个东西,这对我来说是违反直觉的......即使是一个其他无意义的表达。)叹息。 &lt;/rant&gt;。谢谢@MrFlick。

标签: r math arithmetic-expressions


【解决方案1】:

请注意,在 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 帮助页面)。它是给定表达式中要计算的最后一个运算符。

请注意,&amp;| 的优先级低于 !,所以当你这样做时

!a | !b & !c

和这个是一样的

(!a) | ((!b) & (!c))

因此,如果您只使用逻辑运算符,这大致就是您所期望的。将逻辑运算符和算术运算符结合起来可能会有点奇怪。

【讨论】:

  • “否定运算符!应用于运算符右侧的整个表达式的值”在这里是正确的,但可能会产生误导,在我看来,! 的优先级最弱。在实践中最相关的是&amp;&amp;&amp;||| 的优先级较低。
  • @Moody_Mudskipper 好点。我更新以澄清它会在遇到优先级较低的运算符时停止。
猜你喜欢
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多