问题 - 我想将一个函数列表导出为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_1
,add_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()
指令更安全,因为在使用后者时,必须保持警惕,防止意外命名与正则表达式匹配的包命名空间中的对象。
答案 0 :(得分:2)
您可以使用最近@rawNamespace
中的roxygen2
标记,这允许在NAMESPACE
文件中使用有效的任意语法,包括exportPattern()
:
#' @rawNamespace exportPattern("^add_.*$")