R 将否定的逻辑值相加时的有趣结果

R 将否定的逻辑值相加时的有趣结果,r,R,考虑 > TRUE + FALSE [1] 1 现在,使用is.na函数和否定运算符设置一种情况,其中某个对象的计算结果为逻辑: > x = NA > y = "not NA" 计算为TRUE和FALSE: > !is.na(x) [1] FALSE > !is.na(y) [1] TRUE 但是, 这很奇怪。添加额外的括号似乎可以解决问题,但为什么会发生这种情况 > (!is.na(x)) + (!is.na(y)) [1] 1 这是由于运算符优先

考虑

> TRUE + FALSE
[1] 1
现在,使用
is.na
函数和否定运算符
设置一种情况,其中某个对象的计算结果为逻辑

> x = NA
> y = "not NA"
计算为
TRUE
FALSE

> !is.na(x)
[1] FALSE

> !is.na(y)
[1] TRUE
但是,

这很奇怪。添加额外的括号似乎可以解决问题,但为什么会发生这种情况

> (!is.na(x)) + (!is.na(y))
[1] 1

这是由于运算符优先级。请参见
?语法
+
之前。有两种方法

!is.na(x) + !is.na(y)
可以解释为:

`!`(`+`(is.na(x), !is.na(y)))

由于运算符的优先顺序,R以第一种方式解释表达式。将此与

!is.na(x) & !is.na(y)
这里,R将表达式解释为

`&`(`!`(is.na(x)), !is.na(y))

作为
位于
之前

我相信这是因为第一个
将执行整个表达式,因此它将否定
is.na(x)+的值!is.na(y)
(这是2-也是真的)确实可以解释这种行为,这对我来说似乎非常违反直觉。操作顺序是否有文档记录?
?Syntax
有一些信息和一些链接感谢您让我了解
?Syntax
!is.na(x) & !is.na(y)
`&`(`!`(is.na(x)), !is.na(y))