在包中包含 ggplot2 函数
Include ggplot2 function in package
我试图在包中包含以下 ggplot2 辅助函数[它将标签包装在 grid_facet(.~variable, labeller = "plot.label.wrap")]:
#' Label wrapper for ggplot
#'
#' Include in the facet_grid option of ggplot.
#' @param variable
#' @param value
#' @return wrapper
#' @export
plot.label.wrap <- function(variable, value) {
lapply(strwrap(as.character(value), width=15, simplify=FALSE),
paste, collapse="\n")
}
我的 DESCRIPTION 文件包括:导入:ggplot2。使用该函数的脚本包括:library(ggplot2)。
软件包构建、重新加载并在 ?plot.label.wrap 上提供文档。可以查到:
> getAnywhere(plot.label.wrap)
A single object matching ‘plot.label.wrap’ was found
It was found in the following places
registered S3 method for plot from namespace mypackage
namespace:mypackage
with value
function(variable, value) {
lapply(strwrap(as.character(value), width=15, simplify=FALSE),
paste, collapse="\n")
}
<environment: namespace:mypackage>
但是:
> plot.label.wrap
Error: object 'plot.label.wrap' not found
所以我的问题是,为什么这个函数在 mypackage 的命名空间中找到,但在命令行本身却找不到?
评论中的解决方案是更具体地说明导出,如下所示
#' Label wrapper for ggplot
#'
#' Include in the facet_grid option of ggplot.
#' @param variable
#' @param value
#' @return wrapper
#' @export plot.label.wrap
plot.label.wrap <- function(variable, value) {
lapply(strwrap(as.character(value), width=15, simplify=FALSE),
paste, collapse="\n")
}
roxygen 试图对 @usage
、@details
和 @exports
等事情变得聪明,以使事情变得更简单,但有时,就像在这个例子中,它并不总是锻炼身体。
plot
是一种 S3 通用方法,可以定义为 plot.someclass
,它将为某些 object x
和 class
"someclass" 并且可以简单地通过 plot(x)
.
调用
roxygen 认为您的包的 someclass
是 "label.wrap" 并导出 plot.label.wrap
作为 S3 方法而不是普通函数,希望您将其用作 plot(x)
其中 class(x)
是 "label.wrap" 而不是像您尝试的那样直接尝试使用 plot.label.wrap
(发现它不起作用)。
或者,就像@shadow 提到的那样,您可以通过不在函数名称中使用句点来避免这种混淆,例如 plot_label_wrap
、plot_label.wrap
、plot_labelwrap
等。您不需要有,但在极少数情况下,使用句点会导致意外行为。
我试图在包中包含以下 ggplot2 辅助函数[它将标签包装在 grid_facet(.~variable, labeller = "plot.label.wrap")]:
#' Label wrapper for ggplot
#'
#' Include in the facet_grid option of ggplot.
#' @param variable
#' @param value
#' @return wrapper
#' @export
plot.label.wrap <- function(variable, value) {
lapply(strwrap(as.character(value), width=15, simplify=FALSE),
paste, collapse="\n")
}
我的 DESCRIPTION 文件包括:导入:ggplot2。使用该函数的脚本包括:library(ggplot2)。
软件包构建、重新加载并在 ?plot.label.wrap 上提供文档。可以查到:
> getAnywhere(plot.label.wrap)
A single object matching ‘plot.label.wrap’ was found
It was found in the following places
registered S3 method for plot from namespace mypackage
namespace:mypackage
with value
function(variable, value) {
lapply(strwrap(as.character(value), width=15, simplify=FALSE),
paste, collapse="\n")
}
<environment: namespace:mypackage>
但是:
> plot.label.wrap
Error: object 'plot.label.wrap' not found
所以我的问题是,为什么这个函数在 mypackage 的命名空间中找到,但在命令行本身却找不到?
评论中的解决方案是更具体地说明导出,如下所示
#' Label wrapper for ggplot
#'
#' Include in the facet_grid option of ggplot.
#' @param variable
#' @param value
#' @return wrapper
#' @export plot.label.wrap
plot.label.wrap <- function(variable, value) {
lapply(strwrap(as.character(value), width=15, simplify=FALSE),
paste, collapse="\n")
}
roxygen 试图对 @usage
、@details
和 @exports
等事情变得聪明,以使事情变得更简单,但有时,就像在这个例子中,它并不总是锻炼身体。
plot
是一种 S3 通用方法,可以定义为 plot.someclass
,它将为某些 object x
和 class
"someclass" 并且可以简单地通过 plot(x)
.
roxygen 认为您的包的 someclass
是 "label.wrap" 并导出 plot.label.wrap
作为 S3 方法而不是普通函数,希望您将其用作 plot(x)
其中 class(x)
是 "label.wrap" 而不是像您尝试的那样直接尝试使用 plot.label.wrap
(发现它不起作用)。
或者,就像@shadow 提到的那样,您可以通过不在函数名称中使用句点来避免这种混淆,例如 plot_label_wrap
、plot_label.wrap
、plot_labelwrap
等。您不需要有,但在极少数情况下,使用句点会导致意外行为。