为什么NULL == 1
返回logical(0)
而不是FALSE
?
identical(1, NULL)
返回FALSE
,这是正确的。
我知道==
和identical
不能互换使用,但是NULL == 1
返回logical(0)
的背后是什么?
答案 0 :(得分:4)
当两个操作数的模式不同时,"=="
(或任何其他逻辑运算符)后会有隐式类型强制。来自?"=="
:
如果两个参数是不同类型的原子向量,则一个被强制转换为另一个类型,优先级的(递减)顺序为“字符”,“复杂”,“数字”,“整数”,“逻辑” “和”原始”。
这可以给您带来难以置信的结果!
"0" == 0 ## TRUE
1L == 1.0 ## TRUE
因此在?identical
中,有人提到"=="
并没有真正按照人们认为的去做。
identical
不强制。实际上,如果仅查看?identical
中的示例,就会看到(我做了一些改动):
identical(1, NULL) ## FALSE -- don't try this with ==
identical(1, 1L) ## FALSE, stored as different types (modes)
NULL
用途广泛(或模糊)。参见elaborations here。 "=="
中发生的事情是,NULL
被强制为numeric(0)
,因为mode(1)
是"numeric"
,而您实际上正在测试
numeric(0) == 1 ## NULL == 1
numeric(0) == c(1, 2) ## NULL == c(1, 2)
现在的问题是,为什么结果logical(0)
? R的recycling rule (R-intro)是否不适用?上面的代码为什么不转换为以下代码?
rep_len(numeric(0), 1) == 1 ## NA
rep_len(numeric(0), 2) == c(1, 2) ## NA NA
好吧,在recycling rule (R-lang)中说:
从R 1.4.0开始,任何涉及零长度向量的算术运算都将得到零长度结果。
哦,太好了;这里故意没有回收。所以我们只得到logical(0)
。