在R中,为什么all(numeric(0))返回TRUE,而any(numeric(0))返回FALSE?

10

我试图生成一个序列的索引,其中连续的1出现在向量中,但我遇到了这个奇特的情况。为什么说是奇特的呢?因为我不明白当all()返回TRUE时意味着每个值都是TRUE,所以any()也应该返回TRUE,但在这里并非如此。

all(numeric(0))
# [1] TRUE
any(numeric(0))
# [1] FALSE

我发现大多数问题都涉及比较numeric(0)和数字以及如何避免生成numeric(0)


1
请参阅?all中的“注”部分以获取有关此内容的一些信息。 - Marius
@Marius 再次提醒,运行 ?any 显示相同的语言。我认为我们需要查看源代码才能回答这个问题。 - Tim Biegeleisen
1
@Marius,我实际上是在询问关于all(numeric(0))的情况,但在?all中并没有提到。R是否将numeric(0)logical(0)视为不同的类型? - SKR
1
numeric(0) 会被强制转换为 logical(0),因此它们应该被视为相同。我还应该提到,我并不打算将 ?all 中的细节视为问题的答案,而只是作为一个起点 - 因此发布为评论。 - Marius
4
?all 表示:“返回的结果为 TRUE[...](即使没有值)”。?any 表示:“返回的结果为[...] FALSE[...](即使没有值)”。这就是这两个函数的定义方式。至于它们被定义为这样的原因,我认为这样可以确保 R 中的其他操作按照预期进行。 - neilfws
显示剩余5条评论
2个回答

5

由于我的评论被投票为答案,我将在此发布它。

文档?all指出(仅显示相关部分):

返回的值为TRUE[...](包括如果没有值)

而对于?any,同样只是相关部分:

返回的值是[...]FALSE[...](包括如果没有值)

这些函数是这样定义的,以使其他操作按预期工作。 尤其是正如@bmrn所指出的:all(all(x), all(y)) == all(x, y)


2
类似的现象也出现在 minmax 中:
> min(numeric(0))
[1] Inf
#but
> max(numeric(0))
[1] -Inf

这两个计算会触发警告,但不会出错。重要的问题是它们返回所返回值的原因。为了回答这个问题,请注意另一个有限集合的最小值的名称是其最大下界。对于空集合,任何东西都是下界,因此没有有限数是最大下界,因此被定义为无穷大。对于最大值也适用类似的推理,因为它是最小上界
格论的意义下,空集合的join(最小上界)的唯一合理定义是成为格的底部元素,meet(最大下界)则是成为格的顶部元素。在扩展实数的情况下,这些顶部和底部元素分别是Inf-Inf
这个和 any 以及 all 之间的关系相当直观: all 实际上就是对真值应用了 min。它是一个 meet 运算符,当应用于空集时应该给出格子的顶部,即在真值格子中为 TRUE。同样地,any 基本上就是对真值应用了 max。它是一个 join 运算符,当应用于空集时应该给出格子的底部元素,即在真值格子中为 FALSE

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