【问题标题】:Exported S3 method not found during check检查期间未找到导出的 S3 方法
【发布时间】:2020-12-09 04:08:34
【问题描述】:

在一个包中,我有一个函数foo,它返回一个类"foo" 的对象。我还有一个plot"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。怎么回事?


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

【问题讨论】:

  • 所有那些Roxygen2 cmets 都被 R 忽略了。重要的是你的 NAMESPACE 文件中的内容。向我们展示这一点。我猜你那里没有S3method(plot, foo)。弄清楚如何到达那里,你会没事的。
  • 我的NAMESPACE 文件包括export(foo)S3method(plot,foo)
  • export(foo) 无关紧要,因为错误消息是关于调用plot.foo。我认为你在误导我们你所做的一切。发布真实代码,而不是伪造的。
  • 是的,我在没有正确检查它是否重现我的问题的情况下使用假代码是马虎......我很快就会删除这个问题,因为我已经设法用 真实代码。
  • 通常当您将函数导出为 S3 方法时,您实际上并没有导出实现函数本身。它在包中仍未导出,因此您不能将其称为目录。如果您还必须导出它,请将 @export plot.foo 添加到 plot.foo 函数的另一个导出上方。见:stackoverflow.com/questions/18512528/…

标签: r package roxygen2 rd


【解决方案1】:

如果您希望能够直接调用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)
}

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2019-02-05
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多