覆盖基R中的S3方法

D O*_*gle 10 r r-s3

我试图从教学中使用的本地包中的R stats包中覆盖print.anova()函数.基本上,我想删除标题的打印并添加"总"行而不用新类创建新函数(例如,ANOVA()).

该函数如下所示:

print.anova <- function(x,digits=max(getOption("digits")-2,3),
 signif.stars=getOption("show.signif.stars"),totalSS=TRUE,rm.heading=TRUE,...) {
  if (!any(grepl("Res.Df",colnames(x)))) {         # exclusion for multiple lm objects
    if (!any(grepl("Levene",attr(x,"heading")))) { # exclusion for levenes.test
      if (totalSS) {                               # add total SS row
        x <- rbind(x,c(sum(x$Df),sum(x[,"Sum Sq"]),NA,NA,NA))
        row.names(x)[dim(x)[1]] <- "Total"
      }
    }
  }
  if (rm.heading) attr(x,"heading") <- NULL        # remove heading
  stats::print.anova(x,digits=digits,signif.stars=signif.stars,...)
  invisible(x)
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我不确定是将它作为函数,方法,S3方法,这些的某种组合或其他完全导出.例如,当我尝试这个(roxygenize代码的一部分)时:

#'@export
Run Code Online (Sandbox Code Playgroud)

运行Rcmd检查时,我收到以下警告:

S3 methods shown with full name in documentation object 'print.anova':
  'print.anova'
Run Code Online (Sandbox Code Playgroud)

但是当我加载我的包时,该函数按预期工作.

但是,如果我试试这个:

#'@method print anova
#'@S3method print anova
Run Code Online (Sandbox Code Playgroud)

我没有用Rcmd检查得到任何警告或错误,但是当我尝试在R中使用该函数时,它在stats包命名空间中找到原始函数.此外,如果我这样做

getAnywhere(print.anova)
Run Code Online (Sandbox Code Playgroud)

我明白了

2 differing objects matching ‘print.anova’ were found in the following places
  package:stats
  registered S3 method for print from namespace stats
  namespace:NCStats
  namespace:stats
Run Code Online (Sandbox Code Playgroud)

最后,对于这个版本(不使用导出,但使用方法和S3方法),我的roxygen开发的命名空间中有以下项目

S3method(print,anova)
Run Code Online (Sandbox Code Playgroud)

引起我的困惑的是,我似乎已经成功地做了与其他功能类似的事情(例如,使用方法和使用print.summary.lm的S3method版本).

我很感激在理解我在这里做错的任何帮助(或者我最终如何实现这个目标).预先感谢您的任何帮助.

ps,对于它的价值,我在Windows 7(32位),R 2.15.2和使用RStudio.

Mic*_*ael 5

print.anova您可以创建自己的类,而该类实际上与anova类相同,而不是尝试覆盖该函数。创建一个as.myanova函数,它将一个anova对象变成一个对象,mynanova然后编写您的print.myanova函数。

  • 使用`class(anovaObject)&lt;-c(“ myanova”,“ anova”)`,以便保留anova对象的所有其他方法,并替换所需的方法(即打印)。 (2认同)