Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用:::或在开发多个相关的R包时导出所有内容?_R_Dependencies_Package - Fatal编程技术网

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

使用:::或在开发多个相关的R包时导出所有内容?,r,dependencies,package,R,Dependencies,Package,我正在开发一系列的R包,所有这些包都共享大量的公共代码,这些代码位于一个内部包中,我们称之为myPackageUtilities。所以我有几个包裹 myPackage1,myPackage2等 所有这些包都依赖于myPackageUtilities中的每个方法。有关真实世界的示例,请参见。当然,每个依赖包都有 取决于:myPackageUtilities 在其描述文件中 我的问题是:在myPackage1的R代码中,以下两种从myPackageUtilities访问方法的技术中,哪一种更可取:

我正在开发一系列的R包,所有这些包都共享大量的公共代码,这些代码位于一个内部包中,我们称之为
myPackageUtilities
。所以我有几个包裹

myPackage1
myPackage2

所有这些包都依赖于
myPackageUtilities
中的每个方法。有关真实世界的示例,请参见。当然,每个依赖包都有

取决于:myPackageUtilities

在其描述文件中

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

  • 使用
    访问
    myPackageUtilities
    中的方法,或
  • myPackageUtilities
    导出所有内容(例如,通过在命名空间中包含
    exportPattern(“^[^\\.]”)
  • 选项2会扰乱最终用户的搜索路径,但建议不要使用


    后续问题:如果(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'请参阅?
    :`中关于此运算符的使用的说明。`帮助文件中的说明说明,在您的代码中使用:通常是一个设计错误:因为相应的对象可能出于内部原因而保持内部。如果您觉得需要访问对象,只需要检查,请考虑与包维护器联系。