使用 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_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 循环)。
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_.*$")
问题 — 我想导出函数列表作为 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 循环)。
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_.*$")