我正在 R 中创建一个 S3 类,我希望能够对其进行比较,例如 "<"
, ">"
,和"=="
。而不是根据我读过的内容分别实现这些 group generics我相信我可以使用Ops()
来做到这一点但我还没有找到任何关于如何做到这一点的好例子。
对于 myClass
来说就够了我可以创建一个as.integer.myClass()
函数,并进行比较 a
和b
我可以先转换为整数:
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 < bError 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/