2017-02-14 25 views
3

所以我们有这样的行为:为什么任何()返回NA如果没有真正的价值

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

谁知道返回NA,而不是假的理由? IMO的功能应该测试是否存在非FALSE值,而NA不是。

+3

因为'FALSE | NA'返回NA – akrun

+4

从帮助文件的values部分:“如果x中的至少一个值为TRUE,返回的值为TRUE,如果x中的所有值都为FALSE,则返回FALSE (包括如果没有值),否则值为NA。“ – lmo

+2

使用'任何(na.omit(C(FALSE,NA)))'总是得到TRUE或FALSE。 – Axeman

回答

4

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

返回的值是TRUE,如果在X的值的至少一个为真,假,如果所有的值的x是假的(包括如果没有值)。否则,该值为NA。

当你注意,这似乎从更常用的功能,如summean行为不同,因为NA的存在向量参数这些函数返回值NA。此问题在感知受到joran's answer它指的是文档从?Logic,清理重新报价:

NA是一个有效的逻辑对象。如果x或y的分量是NA,如果结果不明确,结果将为NA。换句话说NA & TRUE评估为NA,但不适用FALSE评估为FALSE。看下面的例子。

所以在歧义的情况下,例如,平均值的其中载体含有NA,或NA | FALSE其中缺失值可能是TRUE的计算,NA将成为输出。而在其他情况下,例如any(c(TRUE, NA))TRUE | NA,尽管存在缺失值,但结果是明确的。 @ Floo0的回答以及对问题的一些评论中,这种逻辑可能更清楚。

4

我将包裹该呼叫在isTRUE,这产生所期望的结果:

> any(c(FALSE, NA)) 
[1] NA 
> isTRUE(any(c(FALSE, NA))) 
[1] FALSE 

从文档:

'IsTrue运算(X)' 是“相同的缩写(TRUE, X)”,所以是 真当且仅当‘x’为长度为一个逻辑向量,其仅 元件是‘TRUE’,并且没有属性(即使不名称)。

+0

好的提示,谢谢 – geotheory

5

我可能是错了,但这里的逻辑是:

NA意味着未知的值。因此,问题

是(FALSE,NA)的值是否为真?

的答案为“我不知道”又名NA因为NA可能是TRUE但它是在你所问的那一刻未知。

以问题

是(TRUENA)真什么价值?

这是回答TRUE为肯定第一个值是TRUE

+1

这实际上是答案(做了一个类似的评论,其内容实际上是@Axeman在我之前所说的)。 – nicola

+0

@nicola:对不起,我没有看到您的评论...你想我删除我的答案并回答自己? – Rentrop

+2

没有。这个答案需要在这里,因为在我看来,接受的答案并没有强调为什么这是完全预期的原因。发布它的人很少。 – nicola

相关问题