为什么所有 (`all`) 都为真而 none (`any`) 同时为真?

How can all (`all`) be true while none (`any`) are true at the same time?

a <- character()
b <- "SO is great"

any(a == b) 
#> [1] FALSE

all(a == b)
#> [1] TRUE

手册这样描述“任何” 给定一组逻辑向量,是否至少有一个值为真? 因此,比较 a == b 中甚至没有一个值产生 TRUE。 如果是这样的话,怎么会‘any’ return FALSE while ‘all’ returns TRUE? '全部' 被描述为给定一组逻辑向量,所有值都为真吗?

简而言之:所有值都为真并且 none 同时为真? 我不是专家,但看起来很奇怪。

问题:

  1. 是否有合理的解释或者只是 R 的一些怪癖?

  2. 解决这个问题的方法是什么?

reprex package (v0.3.0)

于 2021 年 1 月 8 日创建

关于问题2,我知道identical。它适用于我能想到的所有情况。

a <- "a"
b <- "b"
identical(a, b) # FALSE >> works
#> [1] FALSE

a <- character(0)
identical(a, b) # FALSE >> works
#> [1] FALSE

a <- NA
identical(a, b) # FALSE >> works
#> [1] FALSE

a <- NULL
identical(a, b) # FALSE >> works
#> [1] FALSE

a <- b
identical(a, b) # TRUE >> works
#> [1] TRUE

identical 似乎是一个很好的解决方法,尽管对于像我这样的兼职开发人员来说它仍然感觉像是一种解决方法。还有更多的解决方案吗?更好的?为什么 R 首先会这样(见问题)?

reprex package (v0.3.0)

于 2021-01-08 创建

通常,比较 a == b 时,较短向量的元素会根据需要回收。但是,在您的情况下 a 没有元素,因此不会发生回收,结果是一个空的逻辑向量。

any(a == b)all(a == b) 的结果与逻辑量词 for allexists 一致。如果在空范围内量化,for all 给出逻辑合取 (AND) 的中性元素,即 TRUE,而 exists给出逻辑析取 (OR) 的中性元素,即 FALSE.

至于如何避免这些情况,请检查向量是否具有相同的大小,因为比较不同长度的向量很少有意义。

关于问题 1) 我不知道我是否正确,但这是我的想法:

在R中all()是对any()的恭维。为了保持一致性,all(logical(0)) 为真。所以,你的情况是你正在捕捉这个独特的案例。

在数学中,这类似于既开又闭的集合。我不是计算机科学家,所以我不能真正谈论为什么在 R 或 S 中实现此功能时,其中一位老手。

关于问题 2) 我觉得其他回复都回答的很好

shiny package 提供的另一个解决方案isTruthy()。 该软件包引入了 truthy/falsy 的概念,即“通常表示 当强制转换为 base::logical() 时,一个值是 TRUE 还是 FALSE” (参见 documentation)。

require(shiny, quietly = TRUE)

a <- "a"
b <- "b"
isTruthy(a == b) # FALSE >> works
#> [1] FALSE

a <- character(0)
isTruthy(a == b) # FALSE >> works
#> [1] FALSE

a <- NA
isTruthy(a == b) # FALSE >> works
#> [1] FALSE

a <- NULL
isTruthy(a == b) # FALSE >> works
#> [1] FALSE

a <- b
isTruthy(a == b) # TRUE >> works
#> [1] TRUE

其中一个优点是您可以使用其他运算符,例如 %in%match()

R 中的情况是,您永远不知道函数失败时会发生什么 return。 一些函数 return NA,其他 NULL,还有一些长度 == 0 的向量。 isTruthy() 更容易处理多样性。

不幸的是,当一个人不编写闪亮的应用程序时,加载包几乎没有意义,因为 - 除了 isTruthy - 闪亮只会添加一大堆不需要的 Web 应用程序功能。

reprex package (v0.3.0)

于 2021 年 1 月 10 日创建