为什么 NA == NULL,NULL == NULL 打印 logical(0)?

4
为什么NA==NULL的结果是logical(0)而不是FALSE?
还有为什么NULL==NULL的结果是logical(0)而不是TRUE?

下面的回答解决了你的问题吗? - Ben Bolker
1个回答

8
NULL 是一个长度为零的对象,因此任何与 NULL 进行逐元素比较或操作的结果将具有长度为零: logical(0) 表示长度为零的逻辑向量。您可能会发现 identical() 很有用: identical(NULL,NULL) 为 TRUE,identical(NULL,NA) 为 FALSE。另请参阅 ?is.null, ?is.na 以测试是否是特殊值 NANULL

也可以参考:Compare a value to null. Why is this true?

@Dason 指出 == 执行逐元素比较;当您对两个不同长度的向量进行逐元素操作时,R 通常“循环”短向量以使其长度等于长向量(如果长度不能均匀地除尽,则显示警告)。但是R语言定义指出:

从 R 1.4.0 开始,涉及长度为零的向量的任何算术运算都将得到长度为零的结果。


2
只是稍微补充一下答案-要记住“==”是逐元素比较的。如果用它来比较长度为5的两个向量,则会返回一个长度为5的向量。 - Dason
1
是的。稍微有点奇怪的是,如果你比较两个不同非零长度的向量,那么较短的向量会被复制到与较长的向量相同的长度。诚然,将一个零长度的向量复制到正长度是不可能的,但这是一个边缘情况,其逻辑我很难明确地证明... - Ben Bolker
"5 + numeric(0)" 返回 "numeric(0)", 但是 "sum(5, numeric(0))" 返回 "5". 这个行为是否一致?当我看到你的答案时,我想起我几年前写的这个答案,其中出现了这个问题(请参见最后一段),我不确定原因。 - eipi10
1
我认为这与R语言定义语句是一致的。 +是一个算术运算/操作符,sum()是一个函数... sum()结合它的所有元素(例如,sum(5:7,10)是28),而不是逐个计算。 - Ben Bolker
1
"NULL是一个'零长度'对象",也可以通过as.numeric(NULL)as.character(NULL)as.logical(NULL)来演示。 - d.b

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