4

我正在尝试将以下 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")
}

我的说明文件包括:导入: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 的命名空间中找到,而不是在命令行本身?

4

1 回答 1

3

评论中的解决方案是更具体的导出如下

#' 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它将为x具有class“someclass”的某些对象创建一个绘图方法,并且可以简单地由plot(x).

roxygen 认为someclass对于您的包是“label.wrap”并plot.label.wrap作为 S3 方法而不是普通函数导出,希望您将它用作“label.wrap”的plot(x)位置class(x),而不是尝试plot.label.wrap直接使用(并找到它)不起作用)。

或者,就像@shadow 提到的那样,您可以通过不在函数名称中使用句点来避免这种混淆,例如plot_label_wrap, plot_label.wrap,plot_labelwrap等。您不必这样做但在极少数情况下,使用句点会导致意外行为。

于 2015-04-30T15:35:15.693 回答