【问题标题】:Does using package generics require the package to be in Depends or Imports?使用包泛型是否需要包位于 Depends 或 Imports 中?
【发布时间】:2015-05-18 16:57:01
【问题描述】:

首先,我已经阅读了很多关于这个主题的文章。我研究了herehereherehere 的对话。然而,问题是,我仍然认为一个特定的主题没有得到充分讨论。我正在开发一个包,我希望使用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 加载 ggplot2 包(以及它的功能),但没有附加它,而@987654341 @ 确实附加它。

所以,最后,我的问题很简单,我是否正确地认为要使用包泛型,我应该使用 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

我认为这一切都正确?

【问题讨论】:

    标签: r


    【解决方案1】:

    我不是这方面的专家,但这里有一些可行的方法:

    #' @importFrom ggplot2 autoplot
    #' @export autoplot
    
    autoplot <- autoplot
    
    #' @export "autoplot.foo"
    
    autoplot.foo <- function(obj, ...) {
      cat("bar\n")
    }
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 2013-04-21
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 2012-01-28
      相关资源
      最近更新 更多