首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-算术不遵守逻辑not运算符和运算顺序?

R-算术不遵守逻辑not运算符和运算顺序?
EN

Stack Overflow用户
提问于 2019-06-14 23:21:12
回答 1查看 106关注 0票数 1

逻辑NOT运算符!似乎在算术运算中具有非直观的操作顺序:

代码语言:javascript
复制
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

关于*或从逻辑到数字的转换,关于!运算符,肯定有我不理解的地方?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-15 05:45:34

注意,在R中,否定运算符!将应用于运算符右侧的整个表达式,直到它到达末尾或遇到优先级较低的表达式。它不仅否定了最直接的术语。还要回想一下,0被视为FALSE,任何其他数字都被视为TRUE。所以你要观察

代码语言:javascript
复制
!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被求值之后才会发生。没有括号,否定就是最后发生的事情。

所以当你写下

代码语言:javascript
复制
a * !l - b * !l + c

这是相同的

代码语言:javascript
复制
a * !(l - (b * !(l + c)))

因为在否定发生之前,所有的操作都必须发生在否定的右边。

如果您只想否定l条款,您可以这样做

代码语言:javascript
复制
a * (!l) - b * (!l) + c

这是R中运算符优先级的函数(有关详细信息,请参阅?Syntax帮助页面)。它是给定表达式中最后要计算的运算符之一。

请注意,&|的优先级比!低,因此当您这样做时

代码语言:javascript
复制
!a | !b & !c

这是相同的

代码语言:javascript
复制
(!a) | ((!b) & (!c))

因此,如果您只使用逻辑运算符,这大致就是您所期望的。当你将逻辑运算符和算术运算符组合在一起时,它可能会变得有点奇怪。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56601110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档