【问题标题】:What's the difference between identical(x, y) and isTRUE(all.equal(x, y))?相同(x,y)和isTRUE(all.equal(x,y))有什么区别?
【发布时间】:2023-04-05 21:16:02
【问题描述】:

测试isTRUE(all.equal(x, y))identical(x, y)有什么区别吗?

帮助页面显示:

不要在 'if' 中直接使用 'all.equal' 表达式 — 使用 'isTRUE(all.equal(....))' 或 “相同”(如果合适)。

但是“如果合适”让我怀疑。我如何决定这两者中的哪一个是合适的?

【问题讨论】:

    标签: r comparison equality built-in floating-point-comparison


    【解决方案1】:

    all.equal 测试近似相等,而identical 更精确(例如,它不容忍差异,并且比较存储类型)。来自?相同:

    函数‘all.equal’也是 有时用来测试相等这个 方式,但目的是为了某事 不同:它允许小 数值结果的差异。

    您将all.equal 包装在isTRUE 中的一个原因是all.equal报告 差异而不是简单地返回FALSE

    【讨论】:

    • 谢谢,“不容忍”是关键:all.equal(8.0, 9.0, tolerance=1.0)
    • 另一个例子是 identical() 会说 ints 和 longs 是不同的,即使它们具有相同的值,而 all.equal() 会说它们是相等的。
    【解决方案2】:

    identical 比较麻烦。例如:

    > identical(as.double(8), as.integer(8))
    [1] FALSE
    > all.equal(as.double(8), as.integer(8))
    [1] TRUE
    > as.double(8) == as.integer(8)
    [1] TRUE
    

    【讨论】:

      【解决方案3】:

      除了数值容差的差异和存储模式的比较,all.equal()不同,identical还测试关联环境的相等性。 R 中的常规对象通常没有关联的环境——它们最常与functionformula(和terms)对象相关联。但为了说明,我将给出两个不同(新创建的)环境的琐碎对象:

      x <- 2; environment(x) <- new.env()
      y <- 2; environment(y) <- new.env()
      all.equal(x,y)   ## TRUE
      identical(x,y)   ## FALSE
      

      有一个ignore.environment 参数:

      ignore.environment:逻辑上指示在比较闭包时是否应忽略它们的环境。

      但由于它仅在比较闭包(即函数)时应用,因此在这种情况下不会产生影响 - 在比较公式或术语对象时也不会产生影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-07
        • 1970-01-01
        相关资源
        最近更新 更多