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继承的。那么哪个命令传达了这一点?
答案 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
的功能都会首先触发。
希望这解释了不同订单的重要性。