使用roxygen2

时间:2016-10-07 12:53:48

标签: r roxygen2 r-package

问题 - 我想将一个函数列表导出为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-loop)。

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

我想到的是这样一种设施更简洁地表达为

#' @exportObjects names(fns)
NULL

标签@exportObjects将解释其&#34;参数&#34;作为要导出的对象名称的字符向量。

更新

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

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

#' @evalNamespace ns_export(names(fns))

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

1 个答案:

答案 0 :(得分:2)

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

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