坚持使用S3方法定义autoplot

时间:2018-04-17 21:50:18

标签: r r-package roxygen2 r-s3

我坚持为autoplot定义S3方法。

我有以下内容(完整代码here):

#' Autoplot for bigobenchmark object
#'
#' @importFrom ggplot2 autoplot
#'
#' @param object
#'
#' @return A ggplot2 plot
#' @export
#'
#' @examples
#' # Create plot for benchmarks
#' library(ggplot2)
#' bench <- bigobenchmark(1:n, for(i in 1:n) for(i in 1:n) 1:n, args=seq(from=1, to=100, length.out = 50))
#' autoplot(bench)
autoplot.bigobenchmark <- function(object) {
  plt <- ggplot2::ggplot(data = object$benchmarks, ggplot2::aes(x=arg, y=mean, colour=expr))
  plt <- plt + ggplot2::geom_line()
  plt <- plt + ggplot2::geom_pointrange(aes(ymin=min, ymax=max))
  plt
}

据我所知,我应该能够跑,但失败了:

> autoplot(test)
Error in autoplot(test) : could not find function "autoplot"

为什么它没有找到这个功能?我有一个正确的@importFrom ggplot2 autoplot,而Roxygen产生正确的NAMESPACE

ggplot2中的Imports中有DESCRIPTION

我不知道它为什么不起作用以及为什么我需要library(ggplot2)来使用它。

2 个答案:

答案 0 :(得分:5)

导入包时,它通过命名空间(而非附加)加载&#34;&#34; (引自sessionInfo())。

当您想要使用导入包中的函数时,通常使用结构ggplot2::ggplot()来调用它,就像您一样。

因此,要使用autoplot,您仍需要使用ggplot2::autoplot()

如果你不知道,你的包裹不知道来自autoplot的{​​{1}}功能。

有一些解决方案:

  1. 使用ggplot2(有关Depends: ggplot2 vs Importssection 1.1.3 or writing R extensions]
  2. 的讨论,请参阅以下链接
  3. 定义Depends方法,然后调用各种plot函数
  4. 继续使用ggplot2::ggplot(),但要求用户在使用前加载autoplot.bigobenchmark(实际情况的一个示例位于the zoo package。另请参阅ggplot2
  5. 导出您自己的?zoo::autoplot函数,但如果用户稍后加载ggplot2
  6. ,则可能会导致冲突

    这是解决方案2的一个例子

    autoplot

    这是解决方案4的一个例子

    #' plot for bigobenchmark object
    #'
    #' @importFrom ggplot2 autoplot
    #'
    #' @param object
    #'
    #' @return A ggplot2 plot
    #' @export
    #'
    #' @examples
    #' # Create plot for benchmarks
    #' library(ggplot2)
    #' bench <- bigobenchmark(1:n, for(i in 1:n) for(i in 1:n) 1:n, args=seq(from=1, to=100, length.out = 50))
    #' plot(bench)
    #'
    #' @author Andrew Prokhorenkov
    plot.bigobenchmark <- function(object) {
      plt <- ggplot2::ggplot(data = object$benchmarks, ggplot2::aes(x=arg, y=mean, colour=expr))
      plt <- plt + ggplot2::geom_line()
      plt <- plt + ggplot2::geom_pointrange(ggplot2::aes(ymin=min, ymax=max))
      plt
    }
    

    #' Autoplot for bigobenchmark object #' #' @importFrom ggplot2 autoplot #' #' @param object #' #' @return A ggplot2 plot #' @export #' #' @examples #' # Create plot for benchmarks #' library(ggplot2) #' bench <- bigobenchmark(1:n, for(i in 1:n) for(i in 1:n) 1:n, args=seq(from=1, to=100, length.out = 50)) #' autoplot(bench) #' #' @author Andrew Prokhorenkov autoplot <- function(object) UseMethod("autoplot") #' @export autoplot.bigobenchmark <- function(object) { plt <- ggplot2::ggplot(data = object$benchmarks, ggplot2::aes(x=arg, y=mean, colour=expr)) plt <- plt + ggplot2::geom_line() plt <- plt + ggplot2::geom_pointrange(ggplot2::aes(ymin=min, ymax=max)) plt } Imports的更好解释由Josh O&amp; Brian和majom(引用Hadley)在this SO answer

    中提供

答案 1 :(得分:3)

除@ SymbolixAU的回复外,您还可以从autoplot导入ggplot2并将其导出为此类,与ggplot2不会发生冲突:

#' bigobenchmark exported operators and S3 methods
#'
#' The following functions are imported and then re-exported
#' from the bigobenchmark  package to avoid loading them.
#'
#' @importFrom ggplot2 autoplot
#' @name autoplot
#' @export
NULL