10

教えるときに使用するローカル パッケージ内の 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 で関数を使用しようとすると、統計パッケージの名前空間で元の関数が見つかります。さらに、こうすると

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 を使用せず、メソッドと S3method を使用) では、roxygen で開発した名前空間に次の項目があります。

S3method(print,anova)

私の混乱を招くのは、他の関数で同様のことを行うことに成功したように見えることです (たとえば、print.summary.lm でメソッドと S3 メソッド バージョンを使用する)。

ここで何が間違っているか (または、最終的にこの目標を達成する方法) を理解するのに助けていただければ幸いです。よろしくお願いします。

ps、価値のあるものとして、私は Windows 7 (32 ビット)、R 2.15.2、および RStudio を使用しています。

4

1 に答える 1

5

関数をオーバーライドしようとする代わりに、print.anova本質的に anova クラスと同じ独自のクラスを作成できます。オブジェクトをオブジェクトに変換するas.myanova関数を作成してから、関数を記述します。anovamynanovaprint.myanova

于 2013-01-18T20:28:51.503 に答える