R的类的顺序是什么引起的?

时间:2019-09-21 16:05:33

标签: r function class

Hadley声明类分配class(x) <- c("A", "B")执行以下操作:

  

如下一节所述,R按照以下顺序查找方法   它们出现在类向量中。所以在这个例子中,   就像A类是从B类继承的-如果未为A定义方法,   它会退回到B。但是,如果您切换了   类,则相反!

在这里,我的理解是

print.mytest <- function(x, ...) {
  cat(paste0("Just a test for class mytest: ", x, "\n")
}

x <- 1
print(class(x))
# [1] "numeric"
print(x)
# [1] 1
class(x) <- c("mytest")
print(class(x))
# [1] "mytest"
print(x)
# [1] "Just a test for class mytest: 1"

这是我不了解的地方:我期望使用numeric类,但从未使用过。 因此,在第二种情况下,我期望输出[1] 1

x <- 1
print(class(x))
# [1] "numeric"
class(x) <- c(class(x), "mytest")
print(class(x))
# [1] "numeric" "mytest" 
print(x) # Not understood (http://adv-r.had.co.nz/S3.html)
# [1] "Just a test for class mytest: 1"

x <- 1
print(class(x))
# [1] "numeric"
class(x) <- c("mytest", class(x))
print(class(x))
# [1] "mytest"  "numeric"
print(x) # Not understood...
# [1] "Just a test for class mytest: 1"

文档?class也声明

  

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


感谢下面的答案

x <- 1
print(class(x))
class(x) <- c("mytest2", "mytest")
print(class(x))
print(x)
# Just a test for class mytest2:  1 
x <- 1
print(class(x))
class(x) <- c("mytest", "mytest2")
print(class(x))
print(x)
# Just a test for class mytest:  1 

1 个答案:

答案 0 :(得分:5)

仅在未找到类向量中用于类的方法的情况下,才使用默认方法。在问题中没有print.numeric,但是有print.mytest,因此在两种情况下都使用它。它永远不会寻找print.default,因为它可以在类向量中列出的方法中找到一个方法。

也就是说,它查看class(x)的第一个元素,如果在这种情况下,找到了该类的print方法,它将使用它。如果不是,它将移至class(x)的第二个元素并寻找该类的print方法。如果找到它,它将使用它。如果class(x)仅存在两个元素,并且找不到两个元素,则将使用默认方法。

class(x)c("numeric", "mytest")的情况下,没有print.numeric方法,因此它会寻找print.mytest并找到它以便使用它。

class(x)c("mytest", "numeric")的情况下,它会找到print.mytest并因此使用它。

因此,在两种情况下,print.mytest都是选择的方法。