【问题标题】:override S3 methods in base R覆盖基础 R 中的 S3 方法
【发布时间】:2012-12-21 21:00:50
【问题描述】:

我正在尝试覆盖我在教学时使用的本地包中的 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)
}

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

#'@export

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

S3 methods shown with full name in documentation object 'print.anova':
  'print.anova'

但当我加载我的包时,该功能按预期工作。

但是,如果我尝试这样做:

#'@method print anova
#'@S3method print anova

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

getAnywhere(print.anova)

我明白了

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

最后,对于这个版本(不使用export,而是使用method和S3method),我的roxygen-developer命名空间里面有以下项

S3method(print,anova)

让我感到困惑的是,我似乎已经成功地用其他函数做了类似的事情(例如,使用 print.summary.lm 的方法和 S3method 版本)。

如果能帮助我理解我在这里做错了什么(或者我如何最终实现这个目标),我将不胜感激。提前感谢您的帮助。

p.s.,无论如何,我使用的是 Windows 7(32 位)、R 2.15.2,并使用 RStudio。

【问题讨论】:

    标签: r r-s3


    【解决方案1】:

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

    【讨论】:

    • 使用class(anovaObject) &lt;- c("myanova", "anova"),这样您就可以保留 anova 对象的所有其他方法,只需替换您想要的方法(即打印)。
    猜你喜欢
    • 1970-01-01
    • 2014-03-23
    • 2020-07-09
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2013-12-12
    • 2018-02-16
    相关资源
    最近更新 更多