为什么 NULL == 1 返回逻辑(0)而不是 FALSE?

Fin*_*ast 4 null r logical-operators

为什么NULL == 1返回logical(0)而不是FALSE

identical(1, NULL)返回FALSE,这是正确的。

我知道这一点==并且identical不能互换使用,但是NULL == 1返回的背后是什么logical(0)

李哲源*_*李哲源 5

"=="当两个操作数没有相同的模式时,(或任何其他逻辑运算符)背后存在隐式类型强制。来自?"=="

如果两个参数是不同类型的原子向量,一个被强制转换为另一个的类型,优先级的(递减)顺序是“字符”、“复数”、“数字”、“整数”、“逻辑”和“生的”。

这可以给你一些令人难以置信的结果!

"0" == 0  ## TRUE
1L == 1.0 ## TRUE
Run Code Online (Sandbox Code Playgroud)

因此?identical,在 中提到它"=="并没有真正做人们认为它应该做的事情。

identical没有强制。事实上,如果你只看 中的例子?identical,你会看到(我稍微改变了它们):

identical(1, NULL) ## FALSE -- don't try this with ==
identical(1, 1L)   ## FALSE, stored as different types (modes)
Run Code Online (Sandbox Code Playgroud)

NULL非常多才多艺(或含糊不清)。请参阅此处的详细说明。在会发生什么"=="就是NULL被胁迫numeric(0),因为mode(1)"numeric"和你实际测试

numeric(0) == 1  ## NULL == 1
numeric(0) == c(1, 2)  ## NULL == c(1, 2)
Run Code Online (Sandbox Code Playgroud)

现在的问题是,为什么是结果logical(0)?R 的回收规则 (R-intro) 不适用吗?为什么上面的代码没有转换成下面的?

rep_len(numeric(0), 1) == 1  ## NA
rep_len(numeric(0), 2) == c(1, 2)  ## NA NA
Run Code Online (Sandbox Code Playgroud)

好吧,在回收规则 (R-lang) 中,它说:

从 R 1.4.0 开始,任何涉及零长度向量的算术运算都具有零长度结果。

哦,太好了; 这里故意没有回收。所以我们只是得到logical(0).