0

在一个包中,我有一个foo返回类对象的函数"foo"。我也有一个plotclass 的方法"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。到底是怎么回事?


编辑:为了澄清,当devtools::checkplot.foo(foo_object)@examples. plot(foo_object)这并不让我感到惊讶,无论如何用户都应该调用泛型。我的问题仍然存在:为什么devtools::check无法找到plot.foo,因为我已经使用了@export标签并S3method(plot, foo)出现在NAMESPACEafter devtools::document

4

1 回答 1

2

如果您希望能够plot.foo直接调用,那么您还需要显式导出该版本。按照惯例,您通常不会从包中导出特定于类的泛型函数实现。通常,您只需声明 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)
}
于 2020-08-19T23:53:07.460 回答