从版本4.0.0
开始roxygen2(在R-3.1.0
上运行)似乎改变了与S4泛型的导出机制相关的内容:
当一个包只包含通用但没有实际的方法时,即使它的roxygen代码具有@export
标记,也不会导出该泛型(只会导致空export()
文件中的NAMESPACE
条目。
这是一个错误还是我在这里忽略某种“范式转换”?
我之所以希望能够构建只包含泛型的包,那就是遵循SOLID design principles风格的界面范例。
我查看了一下源代码,发现了这个:
# Functions that take complete partitum and return NAMESPACE lines
ns_export <- function(tag, part) {
if (!is.null.string(tag)) return(export(tag))
# FIXME: check for empty exports (i.e. no name)
default_export(part$object, part)
}
这让我有机会尝试提供explit tag
以及@export
标记:
#' @export foo
我也以同样的方式尝试@exportPattern
:
#' @exportPattern foo
虽然这仍然导致export()
文件中的NAMESPACE
行,但它现在似乎也是一种解决方法,因为export(foo)
和exportPattern(foo)
现在也存在!仍然不确定这是否真的是理想的方式。
我已相应更新了插图。
为了便于重现,您可以在github找到完整的R包来说明这种行为。
或者看下面直接看看发生了什么。
唯一的通用,导出“失败”:
#' Foo 1
#'
#' @description
#' I would like to export this as a mere interface for \emph{other} packages.
#' There shall be no default method that will be provided by \emph{this} package.
#'
#' @param x \strong{Signature argument}. Main input argument.
#' @export
setGeneric(name = "foo1", signature = "x", def = function(x) {
standardGeneric("foo1")
})
唯一的仿制药,出口成功(两种选择):
#' Foo 2
#'
#' @param x \strong{Signature argument}. Main input argument.
#' @export foo2
setGeneric(name = "foo2", signature = "x", def = function(x) {
standardGeneric("foo2")
})
#' Foo 3
#'
#' @param x \strong{Signature argument}. Main input argument.
#' @exportPattern foo3
setGeneric(name = "foo3", signature = "x", def = function(x) {
standardGeneric("foo3")
})
通用加一种实际方法:
#' Bar
#'
#' @description
#' Just for illustration purposes, this is a generic for which \emph{this}
#' package also provides a method.
#'
#' @param x \strong{Signature argument}.
#' Main input argument.
#' @rdname bar-method
#' @export
setGeneric(name = "bar", signature = "x", def = function(x) {
standardGeneric("bar")
})
#' @param x \code{\link{ANY}}.
#' @return \code{\link{character}}. \code{"Hello World!"}
#' @rdname bar-method
#' @aliases bar
#' @export
setMethod(f = "bar", signature = signature(x = "ANY"),
definition = function(x) {
"Hello World!"
})
标准功能:
#' Foo Bar
#'
#' @param x \code{\link{character}}.
#' @return \code{\link{character}}. Prints \code{x} and returns it.
#' @export
fooBar <- function(x) {
print(x)
x
}
假设一切都在正确的R包结构中,运行这些命令将对代码进行循环化并构建包:
## Packages //
require("devtools")
require("roxygen2")
## Set working directory //
setwd("path/to/package/roxygen2.problem")
## Roxygenize //
roxygenize()
## Build //
build(binary=TRUE)
## Install //
install()
然后,您将获得以下NAMESPACE
内容:
# Generated by roxygen2 (4.0.0): do not edit by hand
export()
export(foo2)
export(fooBar)
exportMethods(bar)
exportPattern(foo3)
如您所见,出口适用于
@export
或@exportPattern
但不适用于仅包含@export
(没有任何标记)的唯一泛型。