我正在研究使用外部第3方dll加载数据的R包。我已经为可以用.C()
假设我的软件包称为mypackage
,外部软件包称为xternal.dll
。似乎要加载在编译期间生成的mypackage.dll
,有必要先加载external.dll
。我正在使用roxygen2
来管理NAMESPACE
文件,并且已经使用了#' @useDynLib
标签。不幸的是,当roxygen2
写入NAMESPACE
文件时,它会按共享对象的词法顺序(如A-Z,a-z)添加useDynLib
调用。
是否可以通过useDynLib
控制命名空间中roxygen2
的顺序?
到目前为止,我已经找到了以下解决方案,但它们似乎都不是特别引人注目:
将我的包重命名为在外部dll之后按词法排序。
管理NAMESPACE file manually
。
示例: 函数foo.R:
#' @export
#' @useDynLib xternal
#' @useDynLib mypackage
foo <- function(){
return(FALSE)
}
调用NAMESPACE
后返回devtools::document()
:
# Generated by roxygen2: do not edit by hand
export(foo)
useDynLib(mypackage)
useDynLib(xternal)
该软件包无法加载,但是,如果我手动交换两条useDynLib
行,则该软件包将安装并正常工作。
答案 0 :(得分:0)
在GitHub上收到非常有用的提示后:
解决方案是使用@rawNamespace
标记,将逐字行写入NAMESPACE
文件中:
foo.R:
#' @export
#' @rawNamespace useDynLib(xternal); useDynLib(mypackage)
foo <- function(){
return(FALSE)
}
产生一个NAMESPACE文件:
# Generated by roxygen2: do not edit by hand
export(foo)
useDynLib(xternal); useDynLib(mypackage)
,共享对象将以正确的顺序加载。