在开发多个相关的R包时使用:::或导出所有内容?

时间:2016-01-29 01:11:42

标签: r dependencies package

我正在开发一系列R软件包,所有这些软件包共享大量的公共代码,这些代码位于内部软件包中,我们可以将其命名为myPackageUtilities。所以我有几个包

myPackage1myPackage2等......

所有这些包都依赖于myPackageUtilities中的每个方法。有关实际示例,请参阅statnet on CRAN。当然,每个依赖包都有

Depends: myPackageUtilities

在其描述文件中。

我的问题是:myPackage1的R代码中,以下哪两种从myPackageUtilities访问方法的技术更可取:

  1. 使用:::访问myPackageUtilities
  2. 中的方法
  3. myPackageUtilities导出所有内容(例如,在{NAMESPACE中加入exportPattern("^[^\\.]"))?
  4. 选项2会混淆最终用户的搜索路径,但R gurus建议不要使用:::

    后续问题:如果(2)是更好的选择,有没有办法使用roxygen2导出所有内容?

1 个答案:

答案 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。