浅谈R语言中&&,||与&,|的区别

本文详细解析了R语言中的逻辑运算符&&、||、&及|的区别,通过实例展示了它们在向量运算中的行为差异,并探讨了它们在数据处理中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浅谈R语言中&&,||与&,|的区别

  首先,从概念上讲,&&和&都属于逻辑运算符,但是,用起来还是有一些区别,概括地讲:
    &&为值逻辑,&为位逻辑
  说人话就是,&&是讲两个操作目的值做逻辑运算,无论操作对象是向量还是标量,返回值都是一个逻辑值;而&是讲两个对象按位比较,其返回值的长度与对象是标量还是向量有关.
看下面的例子,对于两个等长向量间的运算:

例1:

a<-c(TRUE,FALSE,FALSE,TRUE)
b<-c(FALSE,TRUE,FALSE,TRUE)
a&&b
a&b

结果如下:

[1] FALSE
[1] FALSE FALSE FALSE  TRUE

1.懒惰的&&和||

  可以看出,&&运算符在接收向量时,只取了第一个元素比较,然后返回逻辑值,那如果向量的第一个元素为NA呢,我们再来看一下:
例2:

b<-c(FALSE,TRUE,FALSE,TRUE)
c<-c(NA,TRUE)
b&&c
b||c

注意,这里不以NULL演示是因为c(NULL,TRUE)等价于c(TRUE),无意义

结果如下:

[1] FALSE
[1] NA

这里需要解释一下的是,如下运算规律的存在

> TRUE&&NA
> FALSE&&NA

结果:

[1] NA
[1] FALSE

  简言之,就是&&和||只取向量的第一个元素做比较,即使这一次比较没有获得逻辑值(获得了NA),也会退出比较.

2.严格的&和|

  从例1可以看出,&运算符返回了与对象等长的逻辑值向量,也就是说,&运算符是严格的,它将向量的每一对元素都进行了逻辑运算.那么当两个操作对象不等长时,&如何运算呢?
例3:

b<-c(FALSE,TRUE,FALSE,TRUE)
c<-c(NA,TRUE)
b&c
b|c

结果如下:

[1] FALSE  TRUE FALSE  TRUE
[1]   NA TRUE   NA TRUE

  可以看到,&和|返回值长度始终等于参与运算的对象长度的最大值.上例的运算过程如下:

  对两个运算对象同步遍历,对取出每一对元素进行比较,当有对象被遍历完,而另一对象并未遍历完成(两对象不等长),那么短对象将再次被遍历,直至长对象也被遍历完.

3.结论

  • &&,||是短逻辑,只取操作对象的第一个值运算,具备短路规则,只返回一个逻辑值或NA
  • &,|是长逻辑,循环遍历的取操作的对象的每一对值军算,直到每一个元素都参与了运算,其返回值长度等于操作对象长度的最大值

应用典例:按条件选择数据框-subset()函数
下表是用户提交的数据,我想将其中每一列都为空的行剔除掉,使用subset()函数如下

这里因为不能确定用户操作后,空的单元格是""还是NA,所以用了&来规避两种情况;

finalDF<-subset(finalDF,(!is.na(order1)& order1!='') | 
						(!is.na(product)& product!='') | 
						(!is.na(type) &type!='') | 
						(!is.na(parameter)&parameter!='' ) |
                        (!is.na(sn) &sn!='') | 
                        (!is.na(data)&data!='' ) | 
                        (!is.na(lsl)&lsl!='' ) | 
                        (!is.na(usl) &usl!=''),select=order1:usl)#排除5列都为空的行

结果如下:
在这里插入图片描述
  可以看到,空行可以被正确剔除,但如果不小心使用了||操作符,那么行的筛选将只以第一行的元素有关:
在这里插入图片描述

在JavaScript中,逻辑运算符的优先级是有规定的。根据引用的规定,&amp;&amp;的优先级高于||。这意味着在一个表达式中,如果同时含有&amp;&amp;和||,那么&amp;&amp;运算符会先于||运算符进行计算。而引用指出,在JavaScript中只有6个假值,包括undefined、null、NaN、0、&#39;&#39;(空字符串)和false。这些值在进行逻辑运算时会被当做假值。所以在使用||运算符时,如果第一个操作数为真值,则返回第一个操作数;如果第一个操作数为假值,则返回第二个操作数。而在使用&amp;&amp;运算符时,如果第一个操作数为假值,则返回第一个操作数;如果第一个操作数为真值,则返回第二个操作数。因此,&amp;&amp;和||的优先级对于逻辑运算的结果是有影响的。&lt;span class=&quot;em&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;em&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;em&quot;&gt;3&lt;/span&gt; #### 引用[.reference_title] - *1* *2* [【JS】&amp;&amp;||如何使用,&amp;&amp;||的优先级可以证明吗?](https://blog.csdn.net/weixin_44100002/article/details/121244614)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1&quot;}}] [.reference_item style=&quot;max-width: 50%&quot;] - *3* [浅谈JS运算符&amp;&amp;和|| 及其优先级](https://download.csdn.net/download/weixin_38601364/12998992)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1&quot;}}] [.reference_item style=&quot;max-width: 50%&quot;] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值