4

我想创建一个 S3 类。我如何确定哪种设置类属性的方式是正确的(因为它会有所不同)?

1)覆盖类属性

object <- data.frame(field1 = "a", field2 = 2)
class(object)
# [1] "data.frame"
class(object) <- "MyClass"    # set the class by overwriting the existing one
class(object)
# [1] "MyClass"

2)附加类属性

我还可以附加类名(在开头或结尾):

object2 <- data.frame(field1 = "a", field2 = 2)
class(object2) <- append(class(object2), "MyClass")
class(object2)
# [1] "data.frame"    "MyClass"

object3 <- data.frame(field1 = "a", field2 = 2)
class(object3) <- append("MyClass", class(object3))
class(object3)
# [1] "MyClass"    "data.frame"

我知道在开头和结尾添加类名可能会更改被调用的函数(从?class):

当泛型函数 fun 应用于具有类属性 c("first", "second") 的对象时,系统会搜索名为 fun.first 的函数,如果找到,则将其应用于对象。如果没有找到这样的函数,就会尝试一个名为 fun.second 的函数。如果没有类名产生合适的函数,则使用函数 fun.default(如果存在)。

例如。如果我定义一个重载函数,它并不总是被调用:

print.MyClass <- function(x) { print("printing MyClass") }

print(object)
# [1] "printing MyClass"

print(object2)
#   field1 field2
# 1      a      2

print(object3)
# [1] "printing MyClass"

所以我的问题是:我如何决定如何设置类名(我必须考虑哪些[其他]标准)?

4

1 回答 1

6

参考data.frame:

  • 覆盖如果你用你自己的名字替换类名,那么你必须为每个可以用它调用的泛型定义你自己的方法,除非该泛型的默认方法是好的。如果您的类与数据框完全不同,那么这就是您想要的。例如,在您的对象上无法使用 data.frame 方法的情况下。

  • 前置如果您将类名添加到类向量中,那么当使用具有新类名的对象调用泛型时,泛型将首先查看您是否为它定义了方法,如果没有,它将调用 data.frame方法。如果您想覆盖数据框的某些功能但要使用其他功能,这就是您想要的。例如,在 tibble 包中,tibble 对象的类向量是c("tbl_df", "tbl", "data.frame"),而在 data.table 包中,data.table 对象的类向量是c("data.table", "data.frame")

  • 附加通常您不想将您的课程放在现有课程之后。如果你这样做了,那么它只会在没有 data.frame 方法的情况下被调用。

于 2017-07-18T20:55:12.833 回答