all()函数返回TRUE,但any()函数却针对同一比较结果返回FALSE

4

any()函数的描述为“给定一组逻辑向量,是否至少有一个值为真?”,而all()函数则表示“给定一组逻辑向量,所有的值都是真的吗?”。这意味着在all()中返回TRUE的所有内容也应该在any()中返回TRUE。但请看这里:

all(NULL == "Yes")
[1] TRUE
any(NULL == "Yes")
[1] FALSE

我知道有一个名为is.null()的函数,它对于all(is.null(NULL))any(is.null(NULL))给出相同的结果。但在我的情况下,我不需要使用is.null()。我正在编写一个包含用户选择的函数。这些选择可以是预定义的单词或NULL(如果没有进行选择)。当然,我可以在内部重新赋值NULL为一个单词(例如“no_choice”),但是为什么any()返回FALSE呢?此外,问题并不是那么关于is.null(),因为NULL == 1给出logical(0),同样的悖论情况也适用于:

all(logical(0))
[1] TRUE
any(logical(0))
[1] FALSE

这是一个重复的问题

发现一个问题问了同样的悖论。我无法标记为重复(或不知道如何操作)。

1个回答

4
从文档中可以看出,any 忽略长度为零的对象:

...
零个或多个逻辑向量。长度为零的其他对象将被忽略,并将其余对象强制转换为逻辑值并忽略任何类。

这与 NULL == 1 有什么关系呢?
如果我们拆开这个问题,我们会发现 NULL == 1 返回一个长度为0的 logical(0)
length(logical(0))
[1] 0

这类似于:

any()
[1] FALSE

那么为什么all会起作用呢?

如果x中的所有值都是真值(包括没有值的情况),则返回TRUE;如果x中至少有一个假值,则返回FALSE。否则,如果na.rm = FALSE且...中不包含假值但至少有一个NA值,则返回NA。

请注意,“包括没有值的情况”这部分。

any的文档条目相比较:

如果x中至少有一个真值,则返回TRUE;如果x中所有值都是假值(包括没有值的情况),则返回FALSE。

我认为重点在于由于将NULL与其他东西进行比较,返回的逻辑向量为空(即长度为零),这影响了any/all处理结果的方式。


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