空布尔集合相等性测试:R语言逻辑空集比较的异常问题
为什么
logical(0) == logical(0)返回空向量而不是TRUE? 这确实是个容易从数学直觉出发产生困惑的点,咱们来拆解R这里的设计逻辑:
1. R的比较运算符是逐元素操作的
在R里,==、!=这类比较符号本质是对向量的对应元素逐一进行比较,返回的结果向量长度和输入向量完全一致。
举个直观的例子:
c(TRUE, FALSE) == c(TRUE, TRUE) # 返回 c(TRUE, FALSE)
两个长度为2的向量,逐元素比较后得到长度为2的结果。那当输入是长度为0的logical(0)时,没有任何元素可以进行比较操作,自然就返回长度为0的逻辑向量——也就是logical(0)。
2. 数学集合相等 vs R的元素级比较
你提到的“空集合相等性”是集合层面的等价判断,但R的==并不负责这个功能。如果要验证两个集合(包括空集合)是否等价,应该用专门的setequal()函数:
setequal(logical(0), logical(0)) # 返回 TRUE setequal(logical(0), c(TRUE)) # 返回 FALSE
这才是对应数学上集合相等性的判断方式。
3. 关于!=的同理逻辑
logical(0) != logical(0)返回logical(0)的原因完全一样:没有元素可以做不等性比较,结果自然是空向量。
简单来说,R的比较运算符是面向向量元素的,而不是面向整个集合的——这就是和你数学直觉产生差异的核心原因啦。
内容的提问来源于stack exchange,提问作者Agriculturist
相关产品推荐
相关产品推荐

