所以我们有这种行为:
any(c(TRUE, FALSE, NA))
#> [1] TRUE
any(c(TRUE, NA))
#> [1] TRUE
any(c(FALSE, NA))
#> [1] NA
任何人都知道返回NA而不是FALSE的理由吗? IMO该函数应该测试是否存在非FALSE值,NA不是。
答案 0 :(得分:5)
此行为在帮助文件的值部分中进行了解释:
如果x中的至少一个值为TRUE,则返回的值为TRUE;如果x中的所有值都为FALSE,则返回FALSE(包括没有值时)。否则值为NA。
正如您所注意到的,这似乎与更常用的函数(如sum
和mean
的行为不同,因为这些函数的向量参数中存在NA值会返回NA。感知中的这个问题由joran's answer清除,它引用?Logic
的文档,重新引用:
NA是一个有效的逻辑对象。如果x或y的分量是NA,如果结果不明确,则结果将是NA。换句话说,NA& TRUE评估为NA,但NA& FALSE评估为FALSE。请参阅以下示例。
因此,在模糊性的情况下,例如,计算向量包含NA的均值,或者NA | FALSE
,其中缺失值可能为TRUE,NA将是输出。而在其他情况下,例如any(c(TRUE, NA))
或TRUE | NA
,尽管存在缺失值,结果仍然是明确的。这个逻辑在@ Floo0的回答和一些对问题的评论中可能更清楚。
答案 1 :(得分:5)
我可能会弄错,但这里的逻辑是:
NA
表示未知价值。所以问题
(
FALSE
,NA
)的任何值是否为真?
回答"我不知道"又名NA
,因为NA
可能是TRUE
,但在您提出要求的那一刻它是未知的。
提出问题
(
TRUE
,NA
)的任何值是否为真?
TRUE
会回答这个问题,因为第一个值肯定是TRUE
。
答案 2 :(得分:4)
我会将调用包裹在isTRUE
中,这会产生所需的结果:
> any(c(FALSE, NA))
[1] NA
> isTRUE(any(c(FALSE, NA)))
[1] FALSE
来自文档:
'isTRUE(x)'是'identical(TRUE,x)'的缩写,因此是 当且仅当'x'是长度为一的逻辑向量时才为真 element为'TRUE'且没有属性(甚至没有名称)。