布尔运算符&和

布尔运算符&和

根据R语言定义,之间的区别&&&(相应地)|||)前者是向量化的,而后者则不是。

根据帮助文本,我读到了类似于“and”和“andAu”(相应的“或”和“Orelse”)之间的差异.意思:不是所有的评估,如果它们不是必须是(即A或B或C总是正确的,如果A是真的,所以停止计算如果A是真的)

有人能帮我照亮这里吗?还有,R中是否有一个和Orelse?


翻翻过去那场雪
浏览 606回答 3
3回答

杨魅力

较短的部分被矢量化,这意味着它们可以返回一个向量,如下所示:((-2:2)&nbsp;>=&nbsp;0)&nbsp;&&nbsp;((-2:2)&nbsp;<=&nbsp;0)#&nbsp;[1]&nbsp;FALSE&nbsp;FALSE&nbsp;&nbsp;TRUE&nbsp;FALSE&nbsp;FALSE较长的表单从左到右计算,只检查每个向量的第一个元素,因此上面给出((-2:2)&nbsp;>=&nbsp;0)&nbsp;&&&nbsp;((-2:2)&nbsp;<=&nbsp;0)#&nbsp;[1]&nbsp;FALSE正如帮助页面所指出的,这使得更长的表单“适合于编程控制流,并且在if子句中通常是首选的。”所以,只有在确定向量长度为1时,才需要使用长形式。你应该绝对一点儿没错某些情况下,向量只有1长度,例如当它们是只返回长度1布尔值的函数时。如果向量长度可能大于1,则需要使用短形式。因此,如果您不能完全确定,您应该先检查,或者使用简短的形式,然后使用all和any将其缩减为长度,以便在控制流语句中使用,如if.功能all和any通常用于向量化比较的结果,以查看所有或任何比较分别是否为真。这些函数的结果肯定是1,因此它们适合用于if子句,而向量比较的结果则不适用。(虽然这些结果适合用于ifelse.最后一个区别是:&&和||只需要评估尽可能多的术语(这似乎就是短路的意思)。例如,下面是一个使用未定义值的比较a如果它没有短路,如&和|别这样,会出错的。a#&nbsp;Error:&nbsp;object&nbsp;'a'&nbsp;not&nbsp;foundTRUE&nbsp;||&nbsp;a#&nbsp;[1]&nbsp;TRUEFALSE&nbsp;&&&nbsp;a#&nbsp;[1]&nbsp;FALSETRUE&nbsp;|&nbsp;a#&nbsp;Error:&nbsp;object&nbsp;'a'&nbsp;not&nbsp;foundFALSE&nbsp;&&nbsp;a#&nbsp;Error:&nbsp;object&nbsp;'a'&nbsp;not&nbsp;found最后,见第8.2.17节R-地狱,标题为“and”。

狐的传说

关于“短路”是潜在的误导,但有一些事实(见下文)。在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
打开App,查看更多内容
随时随地看视频慕课网APP