我试图弄清楚NextMethod()的工作原理。我发现的有关S3类系统的最详细的解释是在钱伯斯和哈斯提(Chats&Hastie,编辑)的统计模型(1993,Chapman&Hall)中进行的,但是我发现有关NextMethod调用的部分有些晦涩。以下是我想理解的相关段落(第268-269页)。



我感到困惑的两点是:

  • 什么是“当前方法”,什么是“先前方法”?
  • “调用继承方法的参数”,“参数的表达式”和“当前方法的相应形式参数的名称”之间有什么区别?

  • 一般而言,如果有人能以一种较为幸运的方式重述以上各段中的描述,我将不胜感激。

    最佳答案

    很难完成所有这篇文章,但是我认为这个小例子可以帮助揭开NextMethod调度的神秘面纱。
    我创建一个具有2个类属性(继承性)“第一个”和“第二个”的对象。

    x <- 1
    attr(x,'class') <- c('first','second')
    
    然后,我创建一个generic方法Cat来打印我的对象
    Cate <- function(x,...)UseMethod('Cate')
    
    我为每个类定义Cate方法。
    Cate.first <- function(x,...){
      print(match.call())
      print(paste('first:',x))
      print('---------------------')
      NextMethod()                ## This will call Cate.second
    }
    
    Cate.second <- function(x,y){
      print(match.call())
      print(paste('second:',x,y))
    }
    
    现在,您可以使用以下示例检查Cate调用:
     Cate(x,1:3)
    Cate.first(x = x, 1:3)
    [1] "first: 1"
    [1] "---------------------"
    Cate.second(x = x, y = 1:3)
    [1] "second: 1 1" "second: 1 2" "second: 1 3"
    
  • 对于Cate.second,以前的方法是Cate.first
  • 参数x和y从当前方法传递到继承的方法
    方法及其在调用NextMethod()时的当前值。
  • 通过“...”形式参数传递的参数y带有正确的参数名称 Cate.second(x = x, y = 1:3)
  • 09-16 15:13