我们说我有一个S3对象:
obj <- list()
obj$A <- "This"
obj$B <- "That"
class(obj) <- "myclass"
我如何为myclass
编写方法,以便在我调用它来创建逻辑向量时引用obj$B
(例如)
例如,我想要这种行为:
obj == "That" # TRUE
obj == "This" # FALSE
我希望obj == "That"
返回TRUE
,但如何告诉==
对象的哪个部分要测试?
如何找到相关文档?
答案 0 :(得分:7)
您应该考虑编写Ops.myclss
方法。它使您能够在单个函数中处理所有组方法。
有关示例实现,请参阅?base::Ops
和methods(Ops)
。 Section 5.6 - Group Methods的R Language Definition中还有一些信息。
以下是Ops.myclass
的示例Ops.Date
,它是Ops.myclass <-
function (e1, e2)
{
if (nargs() == 1)
stop(gettextf("unary %s not defined for \"myclass\" objects",
.Generic), domain = NA)
boolean <- switch(.Generic, `<` = , `>` = , `==` = , `!=` = ,
`<=` = , `>=` = TRUE, FALSE)
if (!boolean)
stop(gettextf("%s not defined for \"myclass\" objects",
.Generic), domain = NA)
if (inherits(e1, "myclass"))
e1 <- e1$B
if (inherits(e2, "myclass"))
e2 <- e2$B
NextMethod(.Generic)
}
的略微修改版本:
e1
请注意,无论e2
还是myclass
是myclass
个对象,比较都会有效。它也适用于扩展Ops
但不定义自己的方法的任何类(尽管错误消息会令人困惑)。
答案 1 :(得分:4)
怎么样:
`==.myclass` <- function(e1, e2){ e1$B == e2 }
> obj=="That"
[1] TRUE
> obj=="This"
[1] FALSE