【问题标题】:How can all (`all`) be true while none (`any`) are true at the same time?怎么可能所有(`all`)都为真,而没有(`any`)同时为真?
【发布时间】:2021-01-08 22:21:12
【问题描述】:
a <- character()
b <- "SO is great"

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

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

手册这样描述“任何” 给定一组逻辑向量,至少有一个值是真的吗? 因此,在比较 a == b 中,甚至没有一个值产生 TRUE。 如果是这种情况,“any”如何返回 FALSE 而“all”返回 TRUE? '全部' 被描述为给定一组逻辑向量,所有的值都是真的吗?

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

问题:

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

  2. 有什么方法可以解决这个问题?

reprex package (v0.3.0) 于 2021-01-08 创建

【问题讨论】:

  • 那是因为a == b这里是空的(因为a是空的)。
  • 您从手册中引用的完整句子是:“如果'x'中的至少一个值是'TRUE',则返回的值是'TRUE',如果所有的都是'FALSE' 'x' 中的值是 'FALSE'(包括如果没有值)”(强调添加)

标签: r logic comparison


【解决方案1】:

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

any(a == b)all(a == b) 的结果与逻辑量词 for allexists 一致。如果你量化一个空范围,for all 给出逻辑合取 (AND) 的中性元素 TRUE,而 exists 给出逻辑析取的中性元素 (或),即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 package (v0.3.0) 于 2021-01-08 创建

    【讨论】:

    • ?all 中有一条注释:“all(logical(0)) 为真是一个有用的约定:它确保 all(all(x), all(y)) == all(x, y) 即使x 的长度为零。” a == b 的长度为零。
    【解决方案3】:

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

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

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

    关于问题 2) 我认为其他回复已经很好地回答了这个问题。

    【讨论】:

    • 在数学中,任何关于空集元素的属性都是真的,因为空集中没有元素,所以你找不到一个属性不正确的元素。这与开闭无关。
    • 是的,你是对的。我在想这是类似的 b/c 他们都依赖于理解他们定义的特定方面。
    【解决方案4】:

    shiny package 提供的另一个解决方案isTruthy()。 该包引入了真/假的概念,“一般表示 强制转换为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 中的情况是,你永远不知道函数失败时会返回什么。 一些函数返回 NA,另一些返回 NULL,还有一些长度 == 0 的向量。 isTruthy() 可以更轻松地处理多样性。

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

    reprex package (v0.3.0) 于 2021-01-10 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-12
      • 2022-11-25
      • 2021-02-12
      • 1970-01-01
      • 2018-01-24
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多