为什么NULL == 1比FALSE返回逻辑(0)?

时间:2018-08-13 08:23:37

标签: r null logical-operators

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

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

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

1 个答案:

答案 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)