使用 roxygen2 导出函数列表

Export a list of functions with roxygen2

问题 — 我想导出函数列表作为 R 包的一部分,最好使用 roxygen2。

更准确地说,我想导出列表中的函数,而不是列表本身。例如,考虑生成为闭包的函数列表,如下所示:

addval <- 1:100
fns <- lapply(addval, function(y) {force(y); function(x) x + y})
names(fns) <- paste0("add_", addval)

然后问题是将函数(例如在fns中使用相同的名称)绑定到包环境,然后将它们包含在包的导出函数中。

将函数绑定到包环境可以很容易地完成;一种方法是

for (nm in names(fns)) assign(nm, fns[[nm]])

但是是否可以使用roxygen2标签导出函数add_1add_2等?

更重要的是:我希望 roxygen2 继续为我管理 NAMESPACE 文件,并且不想直接编写 export() 调用。我能看到的唯一方法是编写代码来生成像

这样的样板
#' @export add_1
NULL

#' @export add_2
NULL

# ...

或更好

#' @export
add_1 <- fns[["add_1"]]

#' @export
add_2 <- fns[["add_2"]]

# ...

(并放弃上面的 for 循环)。

roxygen2 是否已经有与此类样板生成等效的设施,或者我必须自己提供此设施?

我想到了这样的设施,更简洁地表达为

#' @exportObjects names(fns)
NULL

标签 @exportObjects 会将其 "argument" 解释为要导出的对象名称的字符向量。

更新

roxygen2 6.0.1+ 使用新的 @evalNamespace 标签解决了这个问题,它允许您在 NAMESPACE 文件中插入文字条目:

ns_export <- function(nms)
  sprintf("export(%s)", paste(nms, collapse = ","))

#' @evalNamespace ns_export(names(fns))

使用标签 @evalNamespace 比使用 exportPattern() 指令更安全,因为在使用后者时,必须警惕意外命名包命名空间中与正则表达式匹配的对象。

您可以在最近 roxygen2 中使用 @rawNamespace 标签,这允许使用在 NAMESPACE 文件中有效的任意语法,包括 exportPattern():

#' @rawNamespace exportPattern("^add_.*$")