roxygen2:除非定义了方法,否则不会导出S4泛型函数

时间:2014-05-06 13:08:43

标签: r generics roxygen2

从版本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)

如您所见,出口适用于

  1. 泛型的组合加上至少一种实际方法
  2. @export@exportPattern
  3. 提供代码/模式时的唯一泛型
  4. 标准R功能
  5. 但不适用于仅包含@export(没有任何标记)的唯一泛型。

0 个答案:

没有答案