переопределить методы S3 в базе R

Я пытаюсь переопределить функцию print.anova() из пакета статистики R в локальном пакете, который я использую при обучении. По сути, я хочу удалить печать заголовка и добавить «итоговую» строку без создания новой функции (например, 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, она находит исходную функцию в пространстве имен пакета статистики. Кроме того, если я сделаю это

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

Наконец, для этой версии (без использования экспорта, но с использованием метода и метода S3) в моем пространстве имен, разработанном roxygen, есть следующий элемент.

S3method(print,anova)

Меня смущает то, что мне, кажется, удалось сделать что-то подобное с другими функциями (например, используя метод и версию S3method с print.summary.lm).

Я был бы признателен за любую помощь в моем понимании того, что я здесь делаю неправильно (или как я могу в конечном итоге достичь этой цели). Спасибо заранее за любую помощь.

p.s., для чего это стоит, я на Windows 7 (32-разрядная версия), R 2.15.2 и использую RStudio.


person D Ogle    schedule 21.12.2012    source источник


Ответы (1)


Вместо того, чтобы пытаться переопределить функцию print.anova, вы можете создать свой собственный класс, который по существу идентичен классу anova. Создайте функцию as.myanova, которая превратит объект anova в объект mynanova, а затем напишите свою функцию print.myanova.

person Michael    schedule 18.01.2013
comment
Используйте class(anovaObject) <- c("myanova", "anova"), чтобы сохранить все остальные методы для объекта anova и просто заменить те, которые вам нужны (например, печать). - person Calimo; 31.10.2013