Fin*_*ast 4 null r logical-operators
为什么NULL == 1返回logical(0)而不是FALSE?
identical(1, NULL)返回FALSE,这是正确的。
我知道这一点==并且identical不能互换使用,但是NULL == 1返回的背后是什么logical(0)?
"=="当两个操作数没有相同的模式时,(或任何其他逻辑运算符)背后存在隐式类型强制。来自?"==":
如果两个参数是不同类型的原子向量,一个被强制转换为另一个的类型,优先级的(递减)顺序是“字符”、“复数”、“数字”、“整数”、“逻辑”和“生的”。
这可以给你一些令人难以置信的结果!
"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).