我正在开发一系列R软件包,所有这些软件包共享大量的公共代码,这些代码位于内部软件包中,我们可以将其命名为myPackageUtilities
。所以我有几个包
myPackage1
,myPackage2
等......
所有这些包都依赖于myPackageUtilities
中的每个方法。有关实际示例,请参阅statnet on CRAN。当然,每个依赖包都有
Depends: myPackageUtilities
在其描述文件中。
我的问题是:在myPackage1
的R代码中,以下哪两种从myPackageUtilities
访问方法的技术更可取:
:::
访问myPackageUtilities
或myPackageUtilities
导出所有内容(例如,在{NAMESPACE中加入exportPattern("^[^\\.]")
)?选项2会混淆最终用户的搜索路径,但R gurus建议不要使用:::
。
后续问题:如果(2)是更好的选择,有没有办法使用roxygen2导出所有内容?
答案 0 :(得分:3)
假设我们有一个名为randomUtils
的包,这个包有一个名为sd
的函数来计算Slytherin Defiance Quotient。
现在我写了一个名为spellbound
的包。如果spellbound
取决于randomUtils
,则会在搜索路径中找到randomUtils::sd
,并且可能会与计算标准偏差发生冲突。
但是,如果spellbound
导入randomUtils
,则R会安装randomUtils
,但在加载spellbound
时不会加载它。因此,新版sd
无法在搜索路径中找到,但仍可由randomUtils::sd
随着CRAN的贡献越来越多,我们尽可能多地使用Imports变得非常重要,这样我们就不会通过冲突的函数定义来引入意外的行为。
我使用Depends时的一个例子:在编写HydeNet软件包时,我希望最终用户能够与HydeNet一起使用rjags软件包。所以我将rjags放在Depends中,以便library (HydeNet)
能够两个包。 (换句话说,将rjags
放在搜索路径上。
故事的道德,如果您不打算让用户直接访问这些功能,那么它应该是Imports。