r-为什么所有(`all`)都是真的,而没有(`any`)同时是真的


a <- character()
b <- "SO is great"
any(a == b) 
#> [1] FALSE
all(a == b)
#> [1] TRUE

手册描述了类似的"任何">给定一组逻辑向量,其中至少有一个值为真吗定一组逻辑向量,所有值都为真吗

简而言之:所有的值都是真的,而没有一个同时是真的?我不是专家,但这看起来很奇怪。

问题:

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

  2. 有什么办法解决这个问题?

由reprex包(v0.3.0(创建于2021-01-08

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

any(a == b)all(a == b)的结果与所有和存在的逻辑量词是一致的。如果你在一个空范围上量化,for all为逻辑和(AND(提供了中性元素TRUE,而existing则为逻辑析取(OR(提供了中立元素FALSE

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

关于问题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包(v0.3.0(于2021-01-08创建

关于问题1(我不知道我是否正确,但以下是我的想法:

在R中,CCD_ 10是对CCD_ 11的补充。对于一致性,a == b2为真。所以,你正在捕捉这个独特的案例。

在数学中,这类似于一个集是开的和闭的。我不是一个计算机科学家,所以我真的无法解释为什么一个灰胡子在R或S中实现了这一点。

关于问题2(我认为其他回应很好地回答了这个问题。

闪亮包装提供的另一个解决方案为CCD_ 13。该包装引入了truthy/falsy的概念,"通常表明强制为base::logical()时,值是TRUE还是FALSE"(请参阅文档(。

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中的情况是,当函数失败时,你永远不知道它会返回什么。一些函数返回NA,另一些返回NULL,还有一些返回长度为==0的向量。CCD_ 21使得处理分集更加容易。

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

由reprex包(v0.3.0(于2021-01-10创建

相关内容

  • 没有找到相关文章

最新更新