R 实现组泛型 Ops() 以启用 S3 对象的比较

标签 r oop generics comparison

我正在 R 中创建一个 S3 类,我希望能够对其进行比较,例如 "<" , ">" ,和"==" 。而不是根据我读过的内容分别实现这些 group generics我相信我可以使用Ops()来做到这一点但我还没有找到任何关于如何做到这一点的好例子。

对于 myClass 来说就够了我可以创建一个as.integer.myClass()函数,并进行比较 ab我可以先转换为整数:

if(as.integer(a) < as.integer(b)) foo

这完全有效,但我更愿意写

if(a < b) foo

我以为这会起作用,但事实并非如此:

Ops.myClass <- function(e1, e2) {
  Ops(as.integer(e1), as.integer(e2))
}
a < b
Error in (function (classes, fdef, mtable)  :
 unable to find an inherited method for function ‘Ops’ for signature ‘"integer", "integer"’ 

有什么帮助吗? 谢谢!

最佳答案

请注意,Ops(my, my) 失败并出现相同的错误 - 您没有调用 Ops,而是调用属于 Ops 组成员的泛型。因此,获取泛型并在转换后的类型上调用它

Ops.my = function(e1, e2) get(.Generic)(as.integer(e1), as.integer(e2))

> my1 = structure(1:5, class="my")
> my2 = structure(5:1, class="my")
> my1 > my2
[1] FALSE FALSE FALSE  TRUE  TRUE
> my1 == my2
[1] FALSE FALSE  TRUE FALSE FALSE

关于R 实现组泛型 Ops() 以启用 S3 对象的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35902360/

相关文章:

r - R 中的被积函数语法

c# - 我应该在 PHP 中使用类似 C# 的属性处理吗?

r - 如何使用 R networkD3 值和每个节点下方的百分比绘制桑基图

r - 提取向量的位置和值

c# - 为什么 LINQ 运算符被定义为 IEnumerable 接口(interface)上的扩展方法,而不是接口(interface)本身的一部分? C#

c# - 你能定义一个接口(interface),使得实现它的类必须包含一个也是该类的成员吗?

C# 将泛型子类型转换为父类型

python - 在类型别名中使用泛型

c# - 从通用列表中删除属性/列

c++ - 混合 Rcpp 模块和 Rcpp::export