【发布时间】:2019-02-11 05:49:16
【问题描述】:
我正在编写一个导入(并使用)SparkR::sql 和 dbplyr::sql 的包。其他relevantquestions 涉及无意的碰撞,导致我随意的importing。
在我的NAMESPACE 我有:
importFrom(dbplyr, sql)
importFrom(SparkR, sql)
这两个函数都在脚本中使用,考虑到冲突,我肯定总是在包名前加上前缀:
dbplyr::sql(...)
SparkR::sql(...)
尽管如此,我在构建/检查包时收到了导入替换警告:
警告:加载“my_pkg”时,将之前的导入“dbplyr::sql”替换为“SparkR::sql”
我在Writing R Extensions 中看到的内容似乎如下:
如果一个包只需要另一个包中的几个对象,它可以在代码中使用完全限定的变量引用 [
foo::f] 而不是正式导入...这比正式导入效率略低,而且也会丢失将所有依赖项记录在NAMESPACE文件中的优点(但它们仍然需要记录在DESCRIPTION文件中)。评估foo::f将导致包foo被加载,但如果尚未加载,则不会附加该包 - 这可能是延迟加载很少使用的包的优势。
我认为这个/最佳实践的要点是:
- 选择最常用的函数并将其添加到
importFrom - 从
importFrom中删除“不太频繁”的功能,但将该包保留在DESCRIPTION中 - 只需使用
::(可能前面有require())作为“不太频繁”的功能
【问题讨论】:
-
我认为(尤其是在这种情况下)我总是使用
::表示法,即使一个明确地在NAMESPACE中...为了清楚起见,如果没有别的。我同意被告知“你应该把它放在NAMESPACE”然后在故意的时候得到警告似乎是违反直觉的。只是我的 2 美分。
标签: r r-package dbplyr name-collision