【发布时间】: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 之后?
【问题讨论】:
-
所有那些
Roxygen2cmets 都被 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/…