【问题标题】:How can I make `==` always evaluate to `TRUE`?我怎样才能让`==`总是评估为`TRUE`?
【发布时间】:2021-09-24 10:59:07
【问题描述】:

这也许是一个不寻常的问题。我想知道是否有可能在 R 中创建一个对象y,而x == y 总是评估为TRUE,或者可能的NA(例如,如果xNA),无论@ 的值是多少987654327@.

如有必要,y 也可以是函数调用 y()

我能想到的解决此类问题的唯一方法是使用sys.call()sys.calls(),但到目前为止,我对这种方法没有运气。

注意,我不知道你为什么需要这种行为,我只是想知道它是否可以做到。

【问题讨论】:

  • 您需要在这里使用== 还是all.equal() 选项
  • 会覆盖== 计数吗?
  • 我对@9​​87654335@ 的使用特别感兴趣,因为我可以看到您如何使用sys.call()all.equal() 来实现它。但是,如果您使用 all.equal() 发布解决方案,我肯定会 +1。
  • @KonradRudolph 重写并不是我真正想要的对不起
  • @RHertel 您可以覆盖它以检查第二个参数是否是已知的哨兵,否则恢复为默认行为。当然,这仍然会破坏与 OP 的 y 相比的所有代码,但这似乎是明确要求的。

标签: r metaprogramming lazy-evaluation evaluation


【解决方案1】:

我不知道一种非作弊方式 - 您检查调用堆栈的方法很有希望,但没有明显的(对我而言)方法可以在调用堆栈中找到 调用表达式,所以我无法让它工作。

但如果我们愿意作弊,我们可以很容易地做到这一点:每个运算符都可以在 R 中被覆盖,因此您可以根据需要重新定义 ==

也许(稍微)更实际有用,您可以覆盖(组)特定类的泛型。因此,您可以定义一个具有所需语义的类,将 TRUE 与任何其他值进行比较:

# `==` is part of the `Ops` S3 group generic.
Ops.tautology = function (x, y) TRUE

y = structure(list(), class = 'tautology')
1 == y
# [1] TRUE
2 == y
# [1] TRUE
NA == y
# [1] TRUE

这个组泛型的定义在实践中过于简单:它还重新定义了+ 以及基本上所有其他标准二元运算符。我们可能只想在 == 上进行调度,但由于无论如何这是一个 hack,增加的复杂性并不值得。

【讨论】:

    【解决方案2】:

    如果您允许 xNA,我认为这是不可能的。

    考虑以下情况,我们将xy 都设置为NA

    x <- NA
    y <- NA
    x == y
    > [1] NA
    

    【讨论】:

    • 啊哈!很好的一点。我将编辑我的问题以允许这样做,但我将把它保持打开状态,因为我真正感兴趣的是看看 y 参数有多“聪明”。
    猜你喜欢
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2021-05-27
    • 2017-09-07
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多