布尔运算符&&和
根据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,则要使用简写形式。 因此,如果你不确定,你应该首先检查,或者使用简写形式,然后使用all
和any
一个将它缩小到最大长度以用于控制流程语句,如if
。
all
和any
函数都经常用于向量化比较的结果,以查看所有或任何比较是否为真。 这些函数的结果肯定是长度为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 && true
和false && false
都是false)。 ||
当第一个操作数为真时。
你可以在这里阅读更多关于这个:http://en.wikipedia.org/wiki/Short-circuit_evaluation从该页上的表中,你可以看到, &&
等同于VB.NET中的AndAlso
,我假设你指的是。