R S3 类:决定是覆盖还是附加类属性的类名

R Y*_*oda 4 r r-s3

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

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"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

我知道在开头和结尾附加类名可能会改变被调用的函数(来自?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"
Run Code Online (Sandbox Code Playgroud)

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

G. *_*eck 6

参考data.frame:

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

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

  • Appending通常你不想把你的类放在现有的类之后。如果你这样做了,那么它只会在没有 data.frame 方法时被调用。