我坚持为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)
来使用它。
答案 0 :(得分:5)
导入包时,它通过命名空间(而非附加)加载&#34;&#34; (引自sessionInfo()
)。
当您想要使用导入包中的函数时,通常使用结构ggplot2::ggplot()
来调用它,就像您一样。
因此,要使用autoplot
,您仍需要使用ggplot2::autoplot()
。
如果你不知道,你的包裹不知道来自autoplot
的{{1}}功能。
有一些解决方案:
ggplot2
(有关Depends: ggplot2
vs Imports
和section 1.1.3 or writing R extensions] Depends
方法,然后调用各种plot
函数ggplot2::ggplot()
,但要求用户在使用前加载autoplot.bigobenchmark
(实际情况的一个示例位于the zoo package。另请参阅ggplot2
?zoo::autoplot
函数,但如果用户稍后加载ggplot2 这是解决方案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