为什么any()在没有真值时返回NA

时间:2017-02-14 12:43:09

标签: r

所以我们有这种行为:

any(c(TRUE, FALSE, NA))
#> [1] TRUE
any(c(TRUE, NA))
#> [1] TRUE
any(c(FALSE, NA))
#> [1] NA

任何人都知道返回NA而不是FALSE的理由吗? IMO该函数应该测试是否存在非FALSE值,NA不是。

3 个答案:

答案 0 :(得分:5)

此行为在帮助文件的值部分中进行了解释:

  

如果x中的至少一个值为TRUE,则返回的值为TRUE;如果x中的所有值都为FALSE,则返回FALSE(包括没有值时)。否则值为NA。

正如您所注意到的,这似乎与更常用的函数(如summean的行为不同,因为这些函数的向量参数中存在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表示未知价值。所以问题

  

FALSENA)的任何值是否为真?

回答"我不知道"又名NA,因为NA可能是TRUE,但在您提出要求的那一刻它是未知的。

提出问题

  

TRUENA)的任何值是否为真?

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'且没有属性(甚至没有名称)。