关于 R 语言中的“或”和“与”运算符的问题?

3
我有一个关于R语言中的运算符的一般性问题。
在下面的示例中,我将一个值分配给2个变量x和y,并对它们进行一些逻辑运算。但是当我将表达式括在括号中时,结果会改变...我想知道这背后的逻辑是什么?例如:
x = 10
y = 2

# x or y is equal to 2
>x|y == 2
[1] TRUE

但是当我加上括号:

> (x|y) == 2 
[1] FALSE

此外,如果我只检查x

> x|x == 2
[1] TRUE
> (x|x) == 2 
[1] FALSE

同样地,对于 &

> x&y == 2
[1] TRUE
> (x&y)==2
[1] FALSE

我知道这可能是一个基础问题,但其逻辑并不像我最初想象的那样直观!我知道网上有很多关于这些操作符的资源.. 但似乎没有一个能够直接回答这种类型的问题。 我想知道这里到底发生了什么?


1
你难道不是在比较 TRUE == 2> x|y# [1] TRUE 吗?| 返回TRUE,如果 'x'和 'y' 中的任何一个值为非零,而 & 只有当两个都不为0时才返回TRUE。此外,如果没有括号,操作符是有优先级的。 - akrun
1个回答

3
这个原因与将非零值转换为TRUE和零转换为FALSE有关。
> as.logical(x)
[1] TRUE
> as.logical(0)
[1] FALSE

当我们使用|(或),它会检查元素是否非零,从而返回TRUE; 而在&中,两个元素都应该是非零的。

> x|y
[1] TRUE

当我们与2进行比较时,它并不相等,因为lhs是逻辑值,在被强制转换为1(二进制值对应于1/0的TRUE/FALSE),而rhs是2。

> (x|y) == 2 
[1] FALSE
> (x|y) == 1
[1] TRUE

另外,当我们不把它们放在括号里时,也存在运算符优先级。

x&(y == 2)
[1] TRUE

这段代码返回 TRUE,因为 x 是非零值,而y == 2返回 TRUE,因此两个条件都得到满足并返回 TRUE。

> y==2
[1] TRUE

1
我理解了。谢谢你的解释! - Electrino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接