使用roxygen2

时间:2018-11-06 12:18:08

标签: r r-package roxygen2

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

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

假设我的软件包称为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行,则该软件包将安装并正常工作。

1 个答案:

答案 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)

,共享对象将以正确的顺序加载。