检查期间未找到导出的 S3 方法

Exported S3 method not found during check

在一个包中,我有一个函数 foo returns class "foo" 的一个对象。我还有一个 plot 方法 class "foo".

#' Create a "foo" object
#'
#' @param x An \R object.
#' 
#' @return
#' A "foo" object.
#'
#' @examples
#' foo_object <- foo(1)
#' plot.foo(foo_object)
#'
#' @export
foo <- function(x) {
    structure(x, class = "foo")
}

#' @export
#' @importFrom graphics plot
plot.foo <- function(x, ...) {
    class(x) <- setdiff(class(x), "foo")
    plot(x)
    invisible(NULL)
}

在使用 devtools::load_all 加载包后,我可以毫无问题地评估示例代码。但是,devtools::check 抱怨:

Error in plot.foo(foo_out) : could not find function "plot.foo"
  Execution halted

我的 R 会话似乎知道 plot.foo,但不知道 devtools::check。这是怎么回事?


编辑: 澄清一下,当我用 plot(foo_object) 替换 @examples 下的调用 plot.foo(foo_object) 时,devtools::check 通过了。这并不让我吃惊,无论如何用户都应该调用泛型。我的问题仍然存在:为什么 devtools::check 无法找到 plot.foo,因为我使用了 @export 标签并且 S3method(plot, foo) 出现在 NAMESPACE 之后的 devtools::document ]?

如果您希望能够直接调用 plot.foo,那么您还需要显式导出该版本。按照惯例,通常您不会从包中导出 class-specific 泛型函数的实现。通常,您只需声明 S3 方法存在,而不导出该函数。就像如果你调用 methods(plot) 你会看到一堆带星号的,这意味着它们是意外的并且不应该被直接调用。如果您出于某种原因想要将其导出为单独的函数,您可以添加一个额外的导出语句。例如

#' @rdname foo-methods
#' @export plot.foo
#' @export
#' @importFrom graphics plot
plot.foo <- function(x, ...) {
  class(x) <- setdiff(class(x), "foo")
  plot(x)
  invisible(NULL)
}