R package:如果首选包失败,则全局导入等效包



这个问题的灵感来自于tidytable作为整个tidyverse包的临时替代品的特殊性质和我自己的情况。

我正在开发几个广泛依赖于tidytable的R包。R环境是非常有限和集中控制的(这是不可能改变的),如果包自动退回到dplyr + tidyr + purrr将是有利的。这些更有可能被集中添加/更新到正确的环境中,无论我是否在打扰合适的人。

我目前正在使用@import tidytable,因为我反复使用它的一长串函数。如果tidytable加载失败,是否有可能让我的软件包回到dplyr、tidyr和purrr上?无论我导入其中一个还是其他,我的包都是一样的;但我更喜欢使用tidytable,因为它明显快得多。

我知道对一两个函数有一些变通方法,但不是在整个包中,可能是因为tidytable/dplyr+tidyr+purrr不仅在功能上匹配,而且在语法上也相当不寻常。

一些假设:

  • 您的包没有在CRAN上运行。免责声明,这是我有一个困难的时间,这是让R CMD check表现良好的测试和文档和包检查,当功能需要存在的包是在Suggests:,而不是在Imports:。也许我做错了,我知道这是非常可行的,并且在许多(流行的)软件包中都实现了。所以也许这只是一个预防子弹…
  • 您可以确定代码路径返回相同的结果(没有额外的警告/错误),无论加载哪个包(s),它要么不在乎加载哪个包,要么可以轻松地检测哪个包并正常工作。

因为你需要的包不在Imports:中,那么当有人做library(yourpackage)时,R不会自动导入其中一个或另一个包。在这种情况下,您有两个选择,这取决于您使用.onLoad.onAttach函数的舒适度(参见?ns-hooks):

  • 编写一个辅助函数,调用require(tidytable)1,如果是FALSE,则调用require(tidyverse)(或者只是您真正需要的包,因为加载tidyverse可能不是瞬间的)。如果也是FALSE,则是stop(.)。在每个需要它的包函数中调用这个辅助函数。它为每个函数增加了一个小的开销,但如果包已经加载,通常它几乎是无操作的。

  • 或者,编写该函数,然后从.onLoad调用一次,当有人调用library(yourpackage)时,它将被执行。当有人调用yourpackage::somefunc而不首先调用library(yourpackage)时,这也应该起作用。如果你想要求他们运行library(yourpackage),你可以使用.onAttach,但我不知道这是否增加了任何价值。

指出:

  1. 如果您不熟悉libraryrequire的区别(以及它们的相关功能),请参见https://stackoverflow.com/a/51263513/3358272, https://yihui.org/en/2014/07/library-vs-require/, https://r-pkgs.org/namespace.html#search-path。

最新更新