使用 roxygen2 导出函数列表

egn*_*nha 5 r roxygen2 r-package

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

\n\n

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

\n\n
addval <- 1:100\nfns <- lapply(addval, function(y) {force(y); function(x) x + y})\nnames(fns) <- paste0("add_", addval)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
for (nm in names(fns)) assign(nm, fns[[nm]])\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
#\' @export add_1\nNULL\n\n#\' @export add_2\nNULL\n\n# ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

或更好

\n\n
#\' @export\nadd_1 <- fns[["add_1"]]\n\n#\' @export\nadd_2 <- fns[["add_2"]]\n\n# ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

我认为这样的设施可以更简洁地表达为

\n\n
#\' @exportObjects names(fns)\nNULL\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中标签@exportObjects将其“参数”解释为要导出的对象名称的字符向量。

\n\n

更新

\n\n

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

\n\n
ns_export <- function(nms)\n  sprintf("export(%s)", paste(nms, collapse = ","))\n\n#\' @evalNamespace ns_export(names(fns))\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

krl*_*mlr 3

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

#' @rawNamespace exportPattern("^add_.*$")
Run Code Online (Sandbox Code Playgroud)