S3逻辑运算方法

时间:2016-01-14 23:55:27

标签: r

我们说我有一个S3对象:

obj <- list()
obj$A <- "This"
obj$B <- "That"
class(obj) <- "myclass"

我如何为myclass编写方法,以便在我调用它来创建逻辑向量时引用obj$B(例如)

例如,我想要这种行为:

obj == "That" # TRUE 
obj == "This" # FALSE

我希望obj == "That"返回TRUE,但如何告诉==对象的哪个部分要测试?

如何找到相关文档?

2 个答案:

答案 0 :(得分:7)

您应该考虑编写Ops.myclss方法。它使您能够在单个函数中处理所有组方法。

有关示例实现,请参阅?base::Opsmethods(Ops)Section 5.6 - Group MethodsR 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还是myclassmyclass个对象,比较都会有效。它也适用于扩展Ops但不定义自己的方法的任何类(尽管错误消息会令人困惑)。

答案 1 :(得分:4)

怎么样:

`==.myclass` <- function(e1, e2){ e1$B == e2 }

> obj=="That"
[1] TRUE
> obj=="This"
[1] FALSE