R – 布尔运算符&&和||
根据R语言的定义,&和&&(对应|和||)的区别在于前者是向量化的,而后者则不是。
根据这个网站: http : //www.stat.psu.edu/~dhunter/R/html/base/html/Logic.html我读了类似于“And”和“AndAlso”之间差异的区别(相应地“或”和“OrElse”)…意思是不是所有的评估,如果不是必须的(即A或B或C总是如果A是真的,所以停止评估,如果A是真的)
有人可以在这里放光吗? 还有,R还有一个AndAlso和OrElse吗?
较短的是vector化的,这意味着它们可以返回一个vector,如下所示:
((-2:2) >= 0) & ((-2:2) <= 0) # [1] FALSE FALSE TRUE FALSE FALSE
较长的forms评估从左到右只检查每个向量的第一个元素,所以上面给出
((-2:2) >= 0) && ((-2:2) <= 0) # [1] FALSE
正如帮助页面所说,这使得更长的forms“适合于编程控制stream程,并且在if子句中通常是优选的”。
所以,只有当你确定向量是一个长度的时候,你才想使用长整型。
你应该完全确定你的向量只有长度1,比如在函数返回长度为1的情况下。 如果vector长度可能大于1,则要使用短格式。 所以如果你不是很确定的话,你应该首先检查,或者使用简短的forms,然后使用all
和any
缩小到一个控制stream程语句中使用,如if
。
all
和any
函数都经常用于vector化比较的结果,以查看所有或任何比较是否为真。 这些函数的结果肯定是长度为1,所以它们适用于if子句,而vector化比较的结果则不然。 (虽然这些结果适合用于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节,标题为“和andandand”。
关于“短路”的答案有可能是误导性的,但有一些事实(见下文)。 在R / S语言中, &&
和||
只评估第一个参数中的第一个元素。 vector或列表中的所有其他元素都将被忽略,而不pipe第一个值是多less。 这些操作符被devise为与if (cond) {} else{}
构造一起工作,并且指导程序控制而不是构build新的向量。 &
和|
操作符被devise为处理向量,所以它们将被用于“并行”,也就是说,沿着最长的参数的长度。 如果vector长度不同,则执行较短参数的循环。
当&&
或||
的参数 被评估时,存在“短路”,即如果从左到右连续的任何值是决定性的,则评估停止并返回最终值。
> 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
&&
和||
是所谓的“短路”。 这意味着如果第一个操作数足以确定expression式的值,那么它们不会评估第二个操作数。
例如,如果&&
的第一个操作数是假,那么评估第二个操作数就没有意义,因为它不能改变expression式的值( false && true
和false && false
都是false)。 ||
当第一个操作数是真的。
你可以在这里阅读更多关于这个: http : //en.wikipedia.org/wiki/Short-circuit_evaluation从该页上的表中,你可以看到, &&
等于VB.NET中的AndAlso
,我假设你指的是。