a <- character()
b <- "SO is great"
any(a == b)
#> [1] FALSE
all(a == b)
#> [1] TRUE
手册描述了类似的"任何">给定一组逻辑向量,其中至少有一个值为真吗定一组逻辑向量,所有值都为真吗。
简而言之:所有的值都是真的,而没有一个同时是真的?我不是专家,但这看起来很奇怪。
问题:
有合理的解释吗?或者这只是R的一些怪癖?
有什么办法解决这个问题?
由reprex包(v0.3.0(创建于2021-01-08
通常,在比较a == b
时,会根据需要回收较短向量的元素。但是,在您的案例中,a
没有元素,因此不会发生回收,结果是一个空的逻辑向量。
any(a == b)
和all(a == b)
的结果与所有和存在的逻辑量词是一致的。如果你在一个空范围上量化,for all为逻辑和(AND(提供了中性元素TRUE
,而existing则为逻辑析取(OR(提供了中立元素FALSE
。
至于如何避免这些情况,请检查向量是否具有相同的大小,因为比较不同长度的向量几乎没有意义。
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 == b
2为真。所以,你正在捕捉这个独特的案例。
在数学中,这类似于一个集是开的和闭的。我不是一个计算机科学家,所以我真的无法解释为什么一个灰胡子在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创建