使用 roxygen2 控制 NAMESPACE 中 useDynLib 行的顺序

Controlling the order of useDynLib lines in NAMESPACE with roxygen2

我正在开发一个使用外部第 3 方 dll 加载数据的 R 包。我已经为可以用 .C()

调用的外部 dll 编写了包装函数

假设我的包叫mypackage,外包叫xternal.dll。似乎要加载在编译期间生成的 mypackage.dll,必须首先加载 external.dll。我正在使用 roxygen2 来管理 NAMESPACE 文件,并且我使用了 #' @useDynLib 标签。不幸的是,当 roxygen2 写入 NAMESPACE 文件时,它会按照共享对象的词法顺序添加 useDynLib 调用,例如 A-Z、a-z。

有没有办法通过roxygen2控制命名空间中useDynLib的顺序?

到目前为止,我已经找到了以下解决方案,但它们似乎都不是特别引人注目:

例子: 函数 foo.R:

#' @export
#' @useDynLib xternal
#' @useDynLib mypackage
foo <- function(){
  return(FALSE)
}

在调用 devtools::document():

后得到 NAMESPACE
# Generated by roxygen2: do not edit by hand

export(foo)
useDynLib(mypackage)
useDynLib(xternal)

包将无法加载,但是如果我手动交换两个 useDynLib 行,包将安装并正常工作。

GitHub 收到非常有用的提示后: 解决方案是使用 @rawNamespace 标签,将一行逐字写入 NAMESPACE 文件:

foo.R:

#' @export
#' @rawNamespace useDynLib(xternal); useDynLib(mypackage)
foo <- function(){
  return(FALSE)
}

名称空间文件中的结果:

# Generated by roxygen2: do not edit by hand

export(foo)
useDynLib(xternal); useDynLib(mypackage)

并且共享对象以正确的顺序加载。