根据R语言的定义&,和&&(对应的|和)的区别在于||前者是向量化的,而后者不是。
&
&&
|
||
根据帮助文本,我读到了类似于“And”和“AndAlso”(相应地“Or”和“OrElse”)之间的区别......意思是:如果不是所有的评估都必须是(即如果 A 为真,则 A 或 B 或 C 始终为真,因此停止评估 A 是否为真)
有人可以在这里阐明吗?此外,R 中是否有 AndAlso 和 OrElse?
较短的被向量化,这意味着它们可以返回一个向量,如下所示:
((-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.
all
any
if
函数all和any通常用于向量化比较的结果,以分别查看所有或任何比较是否为真。这些函数的结果肯定长度为 1,因此它们适用于 if 子句,而矢量化比较的结果则不然。(尽管这些结果适用于ifelse.
ifelse
最后一个区别:&&and||只评估他们需要的尽可能多的术语(这似乎是短路的意思)。例如,这是一个使用未定义值的比较a;如果它没有短路,就像&和|不一样,它会给出一个错误。
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”。