情节的新方法 - 如何出口?

时间:2012-10-29 11:39:10

标签: r generics package roxygen

我正在制作一个我想为剧情定义新方法的包。我正在使用roxygen源代码文档。这个问题似乎非常类似于: How to properly document a S3 method of a generic from a different package, using Roxygen?Roxygen2 - how to properly document S3 methods 但我仍然无法让它发挥作用。

导致我麻烦的相关部分是:

#' 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方法也是如此(除了基础)。

所以有两个问题,我希望源于同一个问题:不会导出plot.ABI方法,并且包检查会发出警告。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

问题是您的方法需要与泛型具有相同的参数。假设您使用R:

提供的通用
> args(plot)
function (x, y, ...) 
NULL

现在plot()实际上是一个特例,因为你基本上可以忽略那里有一个参数y

所以你的方法需要像你一样:

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

问题在于,与引用的脚本相反,您必须将通用重新定义为

plot(x)

由于缺少...R CMD check会正确地抱怨。

因此,如果已存在,请不要记录或提供通用。

答案 1 :(得分:4)

一些问题:

  1. 不要包含已在别处定义的通用。只需添加您的方法。

  2. 每个方法的签名必须至少包括泛型中的每个元素,顺序相同。有时令人讨厌,但这是无可争辩的。

  3. <强>更新

    我曾说过,“你的@export需要列出功能名称”,但显然这是不正确的。查看评论。另请注意,列出该方法应该导出它。我似乎记得在你没有在你的包的命名空间中包含泛型的情况下需要显式导出,但我可能是错的(经常是!)。