小编典典

布尔运算符 && 和 ||

all

根据R语言的定义&,和&&(对应的|和)的区别在于||前者是向量化的,而后者不是。

根据帮助文本,我读到了类似于“And”和“AndAlso”(相应地“Or”和“OrElse”)之间的区别......意思是:如果不是所有的评估都必须是(即如果
A 为真,则 A 或 B 或 C 始终为真,因此停止评估 A 是否为真)

有人可以在这里阐明吗?此外,R 中是否有 AndAlso 和 OrElse?


阅读 136

收藏
2022-04-24

共1个答案

小编典典

较短的被向量化,这意味着它们可以返回一个向量,如下所示:

((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE  TRUE FALSE FALSE

较长的形式从左到右评估只检查每个向量的第一个元素,所以上面给出

((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE

正如帮助页面所说,这使得较长的形式“适用于编程控制流,并且通常在 if 子句中首选。”

因此,只有当您确定向量的长度为 1 时,您才想使用长格式。

您应该 绝对 确定您的向量的长度仅为 1,例如在它们是仅返回长度为 1 布尔值的函数的情况下。如果向量的长度可能 >
1,您想使用简短形式。因此,如果您不确定,您应该先检查,或者使用缩写形式,然后使用allandany将其缩短为长度,以便在控制流语句中使用,例如if.

函数allany通常用于向量化比较的结果,以分别查看所有或任何比较是否为真。这些函数的结果肯定长度为 1,因此它们适用于 if
子句,而矢量化比较的结果则不然。(尽管这些结果适用于ifelse.

最后一个区别:&&and||只评估他们需要的尽可能多的术语(这似乎是短路的意思)。例如,这是一个使用未定义值的比较a;如果它没有短路,就像&|不一样,它会给出一个错误。

a
# Error: object 'a' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object 'a' not found
FALSE & a
# Error: object 'a' not found

最后,请参阅The R Inferno中的第
8.2.17 节,标题为“and and andand”。

2022-04-24