R 中的回退和可选依赖项以 CRAN 方式打包?

Fallback and optional dependencies in R packages the CRAN way?

我想为我的包添加一个后备依赖项。问题是我想按照 CRAN 标准来做,但不知道如何正确地做。

更具体地说,我想使用 data.table's fread / fwrite。除此之外,我不想拥有完整的 data.table 依赖关系。如果 data.table 没有安装,我的包应该回退到使用标准 read.csvwrite.csv

我看过类似的帖子:Proper way to handle optional package dependencies

并且还使用了类似于@Hadley 在评论中建议的技术:

req <- require(data.table)
if(req){ 
   data.table::fwrite(...)
 } else {
    write.csv(...)     

  }

这确实有效,但是当 运行 CHECK 我得到一个注意:

'library' or 'require' call to ‘data.table’ in package code. Please use :: or requireNamespace() instead.

这意味着我不会通过 CRAN 的主管...

正确的处理方法是什么?

正如文字所说:

  • 将您对 require() 的(过时)呼叫替换为对 requireNamespace()
  • 的呼叫
  • 然后,在TRUE种情况下,调用包。
  • 我经常用::来指代建议包。

所以模拟这个(注意,未经测试)我会做

myreader <- function(file) {
    if (requireNamespace("data.table", quietly=TRUE)) {
       dat <- data.table::fread(file)
    } else {
       dat <- read.csv(file)
    }
    ## postprocess dat as needed
    dat
}

在 GitHub 的搜索对 user:cran l=R yourTerm 很有用,所以请尝试 this one。我在很多包中都使用了这个习语。