当两个操作数的模式不相同时,
"=="
(或任何其他逻辑运算符)背后有一个隐式类型强制转换。从
?"=="
中了解到:
如果两个参数是不同类型的原子向量,则会将其中一个转换为另一个的类型,优先级(递减)为"字符"、"复杂"、"数字"、"整数"、"逻辑"和"原始"。
这可能会给你一些令人难以置信的结果!
"0" == 0
1L == 1.0
因此,在?identical
中提到,"=="
并没有像人们想象的那样执行操作。
identical
不进行强制转换。事实上,如果你只看一下?identical
中的例子,你会发现(我稍微改变了它们):
identical(1, NULL) ## FALSE
identical(1, 1L) ## FALSE, stored as different types (modes)
NULL
非常灵活(或模棱两可)。在这里进行了详细解释。在 "=="
中发生的是 NULL
被强制转换为 numeric(0)
,因为 mode(1)
是 "numeric"
,实际上你正在测试
numeric(0) == 1
numeric(0) == c(1, 2)
现在的问题是,为什么结果是
logical(0)
?难道R的
recycling rule (R-intro)不适用吗?为什么上述代码没有转换成以下形式?
rep_len(numeric(0), 1) == 1
rep_len(numeric(0), 2) == c(1, 2)
嗯,在 循环规则(R-lang) 中,它说:
自从 R 1.4.0 版本以来,任何涉及零长度向量的算术操作都会得到零长度的结果。
哦好的;这里故意没有循环利用。因此我们只得到 logical(0)
。
length(NULL)
返回零。要测试一个NULL
,请使用is.null
,例如is.null(1)
。 - Rui Barradas