首页 > 解决方案 > 我怎样才能让`==`总是评估为`TRUE`?

问题描述

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

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

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

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

标签: rmetaprogramminglazy-evaluationevaluation

解决方案


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

但是如果我们愿意作弊,我们可以很容易地做到这一点:每个运算符都可以在 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,增加的复杂性并不值得。


推荐阅读