R-算术不尊重逻辑非运算符和运算顺序?

如何

似乎逻辑 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解'| '和'&'运算符行为(R的逻辑运算符)

来自分类Dev

使用R的逻辑运算符(和/或运算符)

来自分类Dev

R%*%运算符

来自分类Dev

R%*%运算符

来自分类Dev

R中的赋值运算符:“ <-”和“ <<-”

来自分类Dev

R中的赋值运算符:“ <-”和“ <<-”

来自分类Dev

R:合并具有多个条件和多个逻辑运算符的data.frames

来自分类Dev

具有子名和逻辑运算符的R子集

来自分类Dev

R中的if语句,else语句和逻辑运算符以及创建函数

来自分类Dev

R Shiny:使用逻辑运算符测试numericInput

来自分类Dev

R中的++运算符

来自分类Dev

r编程语言中的'/'运算符和“%/%”运算符有什么区别?

来自分类Dev

R 中 R6 类的算术运算符重载

来自分类Dev

理解 R 中的“和”和等于运算符

来自分类Dev

R-关系运算符和向量化

来自分类Dev

R-关系运算符和向量化

来自分类Dev

词法作用域和R中的<<-运算符

来自分类Dev

R 与点 (".")、"~" 和竖线 (%>%) 运算符的组合

来自分类Dev

了解非重载按位运算符的转换顺序,算术转换和整数提升

来自分类Dev

逻辑非运算符

来自分类Dev

逻辑非运算符

来自分类Dev

或(或任何逻辑运算符)一起在R中的许多列

来自分类Dev

如何在R中的magrittr中使用逻辑运算符(!)

来自分类Dev

Rcpp上的均等逻辑运算符比基本R上慢8倍

来自分类Dev

使用逻辑运算符比较R中两列不等长

来自分类Dev

R 中 Data.Frame 中的逻辑运算符

来自分类Dev

逻辑AND(&&)和OR(||)运算符

来自分类Dev

逻辑AND(&&)和OR(||)运算符

来自分类Dev

R中%in%运算符的C ++版本