我试图在教学时使用的本地包中覆盖 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 版本)。
如果能帮助我理解我在这里做错了什么(或者我如何最终实现这个目标),我将不胜感激。预先感谢您的任何帮助。
ps,就其价值而言,我使用的是 Windows 7(32 位)、R 2.15.2 并使用 RStudio。