如何管理 R 包中的遗留依赖项?

How to manage legacy dependencies in a R package?

我正在开发依赖于 ReporteRs 库的包的分支。

但是,这个库已经被其所有者弃用了几年,取而代之的是 officer and flextable 库。

这种贬值的主要原因之一是不依赖于 rJava,这可能会导致安装问题和错误。

在我的包裹中,我应该如何处理这种情况?

到目前为止,我的包正在将数据处理到 return 一个 ReporteRs 对象。如果我将函数更改为 return 一个 officer 对象,我将破坏向后兼容性。

但如果我不这样做,并保持旧的 ReporteRs returning 功能作为遗留的向后兼容性功能,我必须在我的依赖项中保留 ReporteRs,我的包会成为 rJava 依赖者。

有没有双赢的方案?

这是我会做的:

  1. 尽最大努力 re-implement 使用官员库的功能,但保留旧的 API。确保警告用户这些功能已被弃用。同时使新功能完全符合officer/flextable语法。请注意,您可以稍微更改函数的行为(例如,不确保正确评估所有参数),只要它们采用相同的参数和 return 相同类型的对象即可。
  2. 如果那真的不可能,只需为您的旧功能添加兼容性警告即可。
  3. 创建一个过渡包版本,您可以使用这些功能的两个版本保留几周或几个月。如果包还需要依赖rJava,那就倒霉了。
  4. 跟踪依赖于您的包裹的包裹。如果不是太多,你可以直接联系他们的开发者。也许问题没有你想象的那么严重?

编辑: 如上所述,您可以使对 ReportR 的依赖以 ReportR 的可用性为条件。然后,您可以将 ReportR 放入 DESCRIPTION 文件的 Suggests 字段而不是 Depends,并且在包中您可以使用这样的代码:

if(requireNamespace("ReportR")) {
   warning("This function is deprecated, better use MyNewFunction instead")
   ReportR::whatever() ...
} else {
   warning("To run this (deprecated) function, please install the ReportR package")
}