使用:::或在开发多个相关的R包时导出所有内容?
我正在开发一系列的R包,所有这些包都共享大量的公共代码,这些代码位于一个内部包中,我们称之为使用:::或在开发多个相关的R包时导出所有内容?,r,dependencies,package,R,Dependencies,Package,我正在开发一系列的R包,所有这些包都共享大量的公共代码,这些代码位于一个内部包中,我们称之为myPackageUtilities。所以我有几个包裹 myPackage1,myPackage2等 所有这些包都依赖于myPackageUtilities中的每个方法。有关真实世界的示例,请参见。当然,每个依赖包都有 取决于:myPackageUtilities 在其描述文件中 我的问题是:在myPackage1的R代码中,以下两种从myPackageUtilities访问方法的技术中,哪一种更可取:
myPackageUtilities
。所以我有几个包裹
myPackage1
,myPackage2
等
所有这些包都依赖于myPackageUtilities
中的每个方法。有关真实世界的示例,请参见。当然,每个依赖包都有
取决于:myPackageUtilities
在其描述文件中
我的问题是:在myPackage1
的R代码中,以下两种从myPackageUtilities
访问方法的技术中,哪一种更可取:
:
访问myPackageUtilities
中的方法,或myPackageUtilities
导出所有内容(例如,通过在命名空间中包含exportPattern(“^[^\\.]”)
:
后续问题:如果(2)是更好的选择,是否有一种方法可以使用roxygen2导出所有内容?假设我们有一个名为
randomUtils
的包,该包有一个名为sd
的函数,用于计算斯莱特林违抗商
现在我编写了一个名为spellbound
的包。如果拼写限制
依赖于randomUtils
,则将在搜索路径中找到randomUtils::sd
,并且可能与计算标准偏差冲突
但是,如果spellbound
导入randomUtils
,则R将安装randomUtils
,但在加载spellbound
时不会加载它。因此,在搜索路径上找不到新版本的sd
,但仍可通过randomUtils::sd
随着对CRAN的贡献越来越多,我们尽可能多地使用导入,这样就不会因为函数定义冲突而引入意外行为,这一点变得非常重要
我使用的示例取决于:在编写HydeNet包时,我希望最终用户能够与HydeNet一起使用rjags包。所以我把RJAG放在Dependes中,这样library(HydeNet)
就可以同时使用这两个包。(换句话说,将rjags
放在搜索路径上
故事的寓意是,如果您不想让用户直接访问函数,那么应该使用导入功能。您能解释一下为什么使用::仍然依赖于包吗?::只适用于导出的方法。因此,我必须导出
myPackageUtilities
(事实上,通过使用Depends而不是Imports,您可以完全绕过::).所以我想我被你说你使用的是Depends弄糊涂了。你不能通过导入和导出包并导出所有方法来完成你需要的吗?这不是你想要的吗?对不起,我应该更清楚:这两个选项都有效,我想知道的是哪个更可取/更好(例如,考虑到副作用等).哦,我几乎总是更喜欢导入一个包,而不是依赖一个包,FWIW。值得明确指出的是,在所有示例中,预期以任何方式在包外部使用的函数都是导出的。(我一点也不反对你的回答,只是说得很清楚,因为OP在问题中谈了很多关于出口的内容,而在这个回答中没有提到)所以当然randomUtils
导出sd
,但是因为拼写的不依赖于randomUtils
,在最终用户的环境中stats::sd
不会被屏蔽,除非最终用户自己加载randomUtils
。很好的解释!一切都是有意义的,但最后一件事很麻烦me:为什么不使用导入
(如@Benjamin建议的那样)但是也不导出任何内容,使用:
来访问这些方法?毕竟,如果用户不希望使用这些方法,那么它们似乎不应该首先被导出。如果我没记错的话,来自拼写绑定的的源代码只能使用导出的randomUtils
中的函数。triple-colon运算符被显式设计为允许访问非导出的方法讨论中,我意识到我的特殊情况比我一开始意识到的要复杂,所以我在这里开始了一个新的讨论:。没错,但请记住,如果您尝试在包中使用::
,当您运行check
时,您将得到以下注意:调用导入的未报告对象:::::::::::::::::::::::::HydeNet::termName'请参阅?
:`中关于此运算符的使用的说明。`帮助文件中的说明说明,在您的代码中使用:通常是一个设计错误:因为相应的对象可能出于内部原因而保持内部。如果您觉得需要访问对象,只需要检查,请考虑与包维护器联系。