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

4
为什么 NULL == 1 的返回值是 logical(0) 而不是 FALSE
identical(1, NULL) 的返回值是 FALSE,这是正确的。
我知道 ==identical 不能互换使用,但是为什么会出现 NULL == 1 返回 logical(0) 的情况呢?

因为 length(NULL) 返回零。要测试一个 NULL,请使用 is.null,例如 is.null(1) - Rui Barradas
更多信息请参见此SO帖子 - phiver
1个回答

5
当两个操作数的模式不相同时,"=="(或任何其他逻辑运算符)背后有一个隐式类型强制转换。从?"=="中了解到:

如果两个参数是不同类型的原子向量,则会将其中一个转换为另一个的类型,优先级(递减)为"字符"、"复杂"、"数字"、"整数"、"逻辑"和"原始"。

这可能会给你一些令人难以置信的结果!
"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的recycling rule (R-intro)不适用吗?为什么上述代码没有转换成以下形式?
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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接