5

プロットの新しいメソッドを定義したいパッケージを作成しています。roxygen のインソース ドキュメントを使用しています。この質問は、Roxygen を使用して、別のパッケージのジェネリックの S3 メソッドを適切に文書化する方法は? と非常に似ているよう です。 および Roxygen2 - S3 メソッドを適切に文書化する方法 ですが、まだ機能させることができません。

問題を引き起こしている関連部分は次のとおりです。

#' Generic plot method
#'
#' @param x \dots
#' @param ... \dots
#' @export
plot <- function(x, ...) UseMethod("plot")

#' Default plot method
#'
#' @param x \dots
#' @param ... \dots
#' @importFrom graphics plot
#' @method plot default
#' @S3method plot default
plot.default <- function(x, ...) graphics::plot(x, ...)

#' Plotting function for ABI object
#'
#' Description.
#' 
#' @param x ABI object as generated by newABI.
#' @param base Character. Bases to look at.
#' @param ... Other options passed to plot().
#' @return Nothing. Side-effect: plots graphs.
#' @method plot ABI
#' @S3method plot ABI
plot.ABI <- function(x, base, ...) {
#Overly simplified
plot(1, 1, main = base)
}

これを実行してメソッド (プロット) を調査すると、ABI オブジェクトに対して定義されたメソッドがありません。ABI:::plot (ABI はパッケージの名前) による関数へのアクセスは機能します。:: を使用することはできません。

パッケージのビルド チェック中に、次の警告が表示されます。

* checking S3 generic/method consistency ... WARNING
plot:
  function(x)
plot.ABI:
  function(x, base, ...)
See section ‘Generic functions and methods’ of the ‘Writing R
Extensions’ manual.

議論には賛否両論あるようです。しかし、ジェネリックには引数 x と ... があり、(ベースに加えて) 私の ABI メソッドもそうであるため、これを理解していません。

したがって、2 つの問題がありますが、これは同じ問題から生じることを願っています。plot.ABI メソッドがエクスポートされず、パッケージ チェックで警告がスローされます。

これを解決するにはどうすればよいですか?

4

2 に答える 2

6

問題は、メソッドがジェネリックと同じ引数を持つ必要があることです。R で提供されるジェネリックを使用していると仮定しましょう。

> args(plot)
function (x, y, ...) 
NULL

plot()そこに引数があることを本質的に無視できるので、今は実際には特別なケースですy

したがって、メソッドはそのままにする必要があります。

plot.ABI <- function(x, base, ...)

問題は、引用されたスクリプトとは対照的に、ジェネリックを次のように再定義する必要があることです

plot(x)

それが欠けている...ので、R CMD check当然文句を言うでしょう。

したがって、ジェネリックが既に存在する場合は、ドキュメント化または提供しないでください。

于 2012-10-29T11:57:20.860 に答える
5

いくつかの問題:

  1. 他の場所で既に定義されているジェネリックを含めないでください。メソッドを追加するだけです。

  2. すべてのメソッドのシグネチャには、少なくともジェネリックのすべての要素が同じ順序で含まれている必要があります。面倒なこともありますが、議論の余地はありません。

アップデート

「関数名をリストする必要がある」と言いまし@exportたが、どうやらこれは正しくありません。コメントを参照してください。メソッドをリストすると、メソッドがエクスポートされることにも注意してください。パッケージの名前空間にジェネリックを含めていない場合は、明示的なエクスポートが必要だったことを思い出すようですが、間違っている可能性があります (よくあります!)。

于 2012-10-29T11:45:51.780 に答える