为什么NULL == 1
返回logical(0)
而不是FALSE
?
identical(1, NULL)
返回FALSE
,这是正确的。
我知道==
和identical
不能互换使用,但是NULL == 1
返回logical(0)
的背后是什么?
当两个操作数没有相同的模式时,"=="
(或任何其他逻辑运算符(后面有一个隐式的类型强制。从?"=="
:
如果两个参数是不同类型的原子向量,则一个参数被强制为另一个参数的类型,(递减的(优先级顺序是"字符"、"复杂"、"数字"、"整数"、"逻辑"和"原始"。
这可以给你一些令人难以置信的结果!
"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
是惊人的多功能(或模糊(。请参阅此处的详细说明。"=="
中发生的事情是,NULL
被强制numeric(0)
,因为mode(1)
是"numeric"
,而你实际上是在测试
numeric(0) == 1 ## NULL == 1
numeric(0) == c(1, 2) ## NULL == c(1, 2)
现在的问题是,为什么结果logical(0)
?R的回收规则(R介绍(不适用吗?为什么上面的代码没有转换为以下内容?
rep_len(numeric(0), 1) == 1 ## NA
rep_len(numeric(0), 2) == c(1, 2) ## NA NA
好吧,在回收规则(R-lang(中,据说:
从 R 1.4.0 开始,任何涉及零长度向量的算术运算都会产生零长度结果。
哦,太好了;这里故意没有回收。所以我们只是得到logical(0)
.