布尔运算符&&和

根据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,则要使用简写形式。 因此,如果你不确定,你应该首先检查,或者使用简写形式,然后使用allany一个将它缩小到最大长度以用于控制流程语句,如if

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

最后一个区别是: &&|| 只评估他们需要的条款(这似乎是短路的含义)。 例如,下面是使用未定义值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”。


关于“短路”的答案可能会产生误导,但有一些事实(见下文)。 在R / S语言中, &&|| 只评估第一个参数中的第一个元素。 无论第一个值如何,向量或列表中的所有其他元素都将被忽略。 这些操作符被设计为与if (cond) {} else{}构造一起工作,并且指导程序控制而不是构建新的向量。 &| 操作符被设计为处理向量,所以它们将被用于“并行”,也就是说,沿着最长参数的长度。 如果向量长度不同,则执行较短参数的回收。

&&||的参数 如果任何值从左到右依次是确定性的,则评估停止并返回最终值,这是“短路”。

> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated
[1] 3
> if(TRUE && print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(TRUE && !print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 3
> if(FALSE && !print(1) ) {print(2)} else {print(3)}
[1] 3

&&|| 是所谓的“短路”。 这意味着如果第一个操作数足以确定表达式的值,那么它们不会评估第二个操作数。

例如,如果&&的第一个操作数为假,那么评估第二个操作数就没有意义了,因为它不能更改表达式的值( false && truefalse && false都是false)。 || 当第一个操作数为真时。

你可以在这里阅读更多关于这个:http://en.wikipedia.org/wiki/Short-circuit_evaluation从该页上的表中,你可以看到, &&等同于VB.NET中的AndAlso ,我假设你指的是。

链接地址: http://www.djcxy.com/p/26779.html

上一篇: Boolean operators && and

下一篇: Equivalent of "continue" in Ruby