为了账号安全,请及时绑定邮箱和手机立即绑定

布尔运算符&和

布尔运算符&和

翻翻过去那场雪 2019-06-15 18:40:58
布尔运算符&和根据R语言定义,之间的区别&和&&(相应地)|和||)前者是向量化的,而后者则不是。根据帮助文本,我读到了类似于“and”和“andAu”(相应的“或”和“Orelse”)之间的差异.意思:不是所有的评估,如果它们不是必须是(即A或B或C总是正确的,如果A是真的,所以停止计算如果A是真的)有人能帮我照亮这里吗?还有,R中是否有一个和Orelse?
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超5个赞

较短的部分被矢量化,这意味着它们可以返回一个向量,如下所示:

((-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 foundTRUE || a# [1] TRUEFALSE && a# [1] FALSETRUE | a# Error: object 'a' not foundFALSE & a# Error: object 'a' not found

最后,见第8.2.17节R-地狱,标题为“and”。


查看完整回答
反对 回复 2019-06-15
?
狐的传说

TA贡献1804条经验 获得超3个赞

关于“短路”是潜在的误导,但有一些事实(见下文)。在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


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 603 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信