这个问题的灵感来自于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
,但我不知道这是否增加了任何价值。
指出:
- 如果您不熟悉
library
和require
的区别(以及它们的相关功能),请参见https://stackoverflow.com/a/51263513/3358272, https://yihui.org/en/2014/07/library-vs-require/, https://r-pkgs.org/namespace.html#search-path。