在r中,类向量的顺序在类继承中是否重要

时间:2018-12-19 17:36:15

标签: r inheritance

x <- c(1, 10, 100)
y <- list(1, 2, 3)
z <- list(5, 50, 500)

a <- tibble(x, y, z)

这是:

class(a) <- c("my_new_class", class(a))

与此不同:

class(a) <- c(class(a), "my_new_class")

显然,“ my_new_class”是从tibble继承的。那么哪个命令传达了这一点?

1 个答案:

答案 0 :(得分:2)

类的顺序对于泛型函数很重要,因为该顺序决定了可能应用的泛型函数的搜索顺序。为class()函数找到的解释很好地解释了这一点:

  

当将通用函数fun应用于具有类属性c(“ first”,“ second”)的对象时,系统将搜索一个名为fun.first的函数,如果找到该函数,则将其应用于该对象。如果找不到这样的函数,则尝试一个名为fun.second的函数。如果没有任何类名会生成合适的函数,则使用fun.default函数(如果存在)。如果没有类属性,则尝试使用隐式类,然后使用默认方法。

在您的情况下,代码的第一部分

x <- c(1, 10, 100)
y <- list(1, 2, 3)
z <- list(5, 50, 500)

a <- tibble(x, y, z)
class(a) <- c("my_new_class", class(a))

使用这些类产生对象a

class(a)
[1] "my_new_class" "tbl_df"       "tbl"          "data.frame"  

第二个产生

class(a) <- c(class(a), "my_new_class")
class(a)
[1] "tbl_df"       "tbl"          "data.frame"   "my_new_class"

顺序明显不同,但也许最好的例子已经通过使用小标题来代替标准data.frames来给出。创建小标题时,类的顺序为"tbl_df", "tbl", "data.frame"。因此,不是不是的为小动作而是为数据帧创建的函数仍然可以使用,因为该函数搜索类并触发最后一个data.table的命中。

如果顺序颠倒了,"data.frame", "tbl", "tbl_df",那么任何会接受标准data.frame的功能都会首先触发。

希望这解释了不同订单的重要性。