使用 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
的顺序?
到目前为止,我已经找到了以下解决方案,但它们似乎都不是特别引人注目:
将我的包重命名为在外部 dll 之后按词法排序。
管理NAMESPACE file manually
。
例子:
函数 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)
并且共享对象以正确的顺序加载。
我正在开发一个使用外部第 3 方 dll 加载数据的 R 包。我已经为可以用 .C()
假设我的包叫mypackage
,外包叫xternal.dll
。似乎要加载在编译期间生成的 mypackage.dll
,必须首先加载 external.dll
。我正在使用 roxygen2
来管理 NAMESPACE
文件,并且我使用了 #' @useDynLib
标签。不幸的是,当 roxygen2
写入 NAMESPACE
文件时,它会按照共享对象的词法顺序添加 useDynLib
调用,例如 A-Z、a-z。
有没有办法通过roxygen2
控制命名空间中useDynLib
的顺序?
到目前为止,我已经找到了以下解决方案,但它们似乎都不是特别引人注目:
将我的包重命名为在外部 dll 之后按词法排序。
管理
NAMESPACE file manually
。
例子: 函数 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)
并且共享对象以正确的顺序加载。