R S3 class:决定覆盖vs附加class属性的类名

时间:2017-07-18 19:59:11

标签: r r-s3

我想创建一个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的函数。如果不   class name产生一个合适的函数,函数fun.default是   使用(如果存在)。

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

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

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

print(object2)
#   field1 field2
# 1      a      2

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

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

1 个答案:

答案 0 :(得分:2)

参考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方法时才会被调用。