处理故意的NAMESPACE冲突

时间:2018-09-06 03:18:57

标签: r r-package dbplyr name-collision

我正在写一个同时导入(并使用)SparkR::sqldbplyr::sql的软件包。其他relevant questions涉及偶然发生的{em> 冲突。

在我的import中,我有:

NAMESPACE

这两个函数都在脚本中使用,并且意识到冲突,所以我确保始终为包名加上前缀:

importFrom(dbplyr, sql)
importFrom(SparkR, sql)

尽管如此,在构建/检查软件包时,我仍然收到导入替换警告:

  

警告:在加载“ my_pkg”时,将以前导入的“ dbplyr :: sql”替换为“ SparkR :: sql”

我在Writing R Extensions中看到的内容如下:

  

如果一个包仅需要另一个包中的几个对象,则可以在代码中使用完全限定的变量引用[dbplyr::sql(...) SparkR::sql(...) ]来代替正式的导入...这比正式的导入效率稍低,并且还失去了将所有依赖项记录在foo::f文件中的优点(但是仍然需要将它们记录在NAMESPACE文件中)。评估DESCRIPTION将导致软件包foo::f已装入但尚未附加(如果尚未装入),这可能会延迟延迟很少使用的软件包的装入。

我对吗?这个/最佳实践的收获是:

  • 选择最常用的功能并将其添加到foo
  • importFrom删除“较少频率”功能,但将该程序包保留在importFrom
  • 只需将DESCRIPTION(也许以::开头)用于“频率较低”功能

1 个答案:

答案 0 :(得分:2)

我一直遵循this advice

  

通常在“说明”中的“导入”中列出软件包,但在“名称空间”中却没有列出。实际上,这就是我的建议:在“ DESCRIPTION”中列出该软件包,以便对其进行安装,然后始终使用pkg :: fun()明确引用该软件包。

在您的情况下:

  • 同时删除 importFrom
  • 将两个软件包保留在Imports:
  • 使用dbplyr::sqlSparkR::sql

我在这里的主要动机是保持一致性:即使没有任何名称冲突,我也要在读取代码(某些功能来自何处)时始终使用全名使其清楚。如果我不使用importForm,而忘记在一个地方使用全名,那么R CMD ckeck将会抓住这一点。我认为这段代码的清晰度高于在两个地方收集依赖项的(可感知的)优势:DESCRIPTION和(更明确地)NAMESPACE。