gpt4 book ai didi

r - 使用包泛型是否需要包处于 Depends 或 Imports 中?

转载 作者:行者123 更新时间:2023-12-05 04:16:08 25 4
gpt4 key购买 nike

首先,我已经阅读了很多关于这个话题的文章。我研究了对话here , here , herehere .然而,问题是,我仍然认为某个特定主题没有得到充分讨论。我正在开发一个包,我希望使用 ggplot2 包中的 autoplot() 泛型创建我自己的方法,即有一个函数,例如 autoplot.MyFunction ()

我当前的 DESCRIPTION 文件包含 Depends: ggplot2 并且一切正常,没问题。我还在函数的帮助文件代码中将其与 Roxygen2 标签 @import ggplot2 以及 @export 相结合。

然而,大多数文档都描述了应该如何尝试使用 Imports: ggplot2。问题是,如果我进行此更改,当我使用 library(my_package) 加载我的包并尝试使用 autoplot.MyFunction() 时,我将面临以下问题错误:

> autoplot(tmp)
Error: could not find function "autoplot"

同样,如果我直接调用函数...

> autoplot.MyFunction(tmp)
Error: could not find function "autoplot.MyFunction"

但是,如果我使用 :: 方法,那么它确实有效...

> ggplot2::autoplot(tmp)

根据我的理解,这是因为 Imports loads ggplot2 包(以及它的函数),但 附上它,而Depends附上它。

所以,最后,我的问题很简单,我认为要使用包泛型是否正确,我应该使用 Depends: package,即在我的例子中 Depends: ggplot2

然后为了在我的包函数中使用包中的函数,我应该使用 Imports: package 加上 ::,例如:

silly_fn <- function (data) {
p <- ggplot(tmp, aes(x, y)) +
geom_line() +
geom_segment(aes(x = 0, xend = 20, y = 0, yend = 20),
arrow = grid::arrow(length = grid::unit(0.15, "inches")))
p
}

需要 Imports: grid 和 Roxygen2 标签 @import grid

我认为这一切都正确吗?

最佳答案

我不是这方面的专家,但这里有一些有用的东西:

#' @importFrom ggplot2 autoplot
#' @export autoplot

autoplot <- autoplot

#' @export "autoplot.foo"

autoplot.foo <- function(obj, ...) {
cat("bar\n")
}

不幸的是,我们需要显式导出该方法,因为出于某种原因,从包命名空间(在本例中为 ggplot2)调度的 S3 找不到从它不导入的包中注册的方法.除了它适用于基础泛型之外,这种方式是有道理的,所以我不知道 S3 注册机制的微妙之处。

关于是否在你的包中使用 :: ,这是有争议的。如果您使用 @import@importFrom,则您不必这样做,但一些人(包括 Hadley)建议您应该这样做以明确起见。我个人反对它,因为 R 分析器不解析 package::method 风格的函数名称,这使得优化代码变得更加困难(有可以同时满足这两个目标的变通方法)。

请注意,您绝对应该使用 @import 而不是仅仅依赖 ::(您还必须更新 DESCRIPTION 文件)。如果不这样做将阻止 R 意识到依赖关系。我很确定 R CMD check 对此大喊大叫。

关于r - 使用包泛型是否需要包处于 Depends 或 Imports 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29079179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com