r - 开发一套依赖 R 包的最佳实践

标签 r dependencies package roxygen2

我开始研究一系列 R 包,所有这些包都共享大量公共(public)代码,这些代码位于自己的包中,我们将其称为 myPackageUtilities。所以我有几个包

myPackage1myPackage2 等...

所有这些包都依赖于 myPackageUtilities 中的每个方法。有关实际示例,请参阅 statnet on CRAN 。这个想法是, future 的开发人员可能会创建 myPackageN,而不必重新编写/复制所有支持代码, future 的开发人员可以简单地使用 mypackageUtilities 来获取开始了。

有一些并发症:

1) mypackageUtilities 中的部分代码适用于最终用户,其余代码用于内部开发目的。最终用户代码需要使用 roxygen2 正确记录。此代码包括 S3 类和泛型,以及为用户提供的各种帮助函数。

2) 依赖包(myPackage1myPackage2 等)可能会扩展 myPackageUtilities 中定义的 S3 泛型。

我的问题是:组装所有这些的最佳方法是什么?这里有两个自然的(但非详尽的)选择:

  1. 在 Imports: 下为所有依赖包添加 mypackageUtilities,并强制用户单独加载 mypackageUtilities
  2. 在 Depends: 下包含所有依赖包的 mypackageUtilities,并严格选择从 mypackageUtilities 导出的内容,以避免搜索路径困惑。所有内部(非导出)代码都必须通过 myPackage1 等中的 ::: 访问。

我最初问过类似的问题over here ,但很快就发现情况很快变得复杂起来。例如:

  • 如果我们使用 Imports: 而不是 Depends:,则 myPackage1 等找不到 mypackageUtilities 中定义的任何泛型。
    • 这使得使用 mypackageUtilities 提供的通用模板变得困难/不可能,并且几乎违背了整个设置的目的。
  • 如果我在 mypackageUtilities 中定义 S3 泛型并在那里记录它,我如何让 roxygen2 在 myPackage1 中引用这些文档?

也许我深深误解了命名空间的工作原理,在这种情况下,这将是消除我的误解的好地方!

最佳答案

欢迎来到兔子洞。

您可能会惊喜地发现,您可以将函数从 myPackageUtilities 导入到 myPackage1 中,然后从 myPackage1 导出以使其可从全局环境访问。

因此,当您说 myPackageUtilities 中有一个函数在加载 myPackage1 时最终用户应该可以访问时,这就是我将包含在我的myPackage1

fn_name 的文档
#' @importFrom myPackageUtilities fn_name
#' @export fn_name

(参见 https://github.com/hadley/dplyr/blob/master/R/utils.r 示例)

这仍然留下了如何链接到原始文档的问题。恐怕我对此没有一个好的答案。我当前的做法本质上是从原始源复制参数文档,然后在我的 @details 部分中写入 please see the Documentation for\code{\link[myPackageUtilities]{fn_name} }

最后,我仍然认为最好的选择是从 myPackageUtilities 导出将在 myPackageUtilities 之外使用的所有内容,并在每个中进行导入-导出组合您希望可以从全局环境访问 myPackageUtilities 中的函数的包。

关于r - 开发一套依赖 R 包的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35118287/

相关文章:

r - install_github是否递归安装依赖项?

angular - Angular 4中的文件上传

java - 错误 - 需要类接口(interface)或枚举

java - 导入maven依赖

Java Eclipse 建议我将方法设为静态

c# - Nuget 包未在 Visual Studio 中更新

r - 有没有办法为 ggsave 设置新的默认值?

R 包 'ps' 安装失败,因为在安装的最后一步中对 mv 的权限被拒绝

r "slot"两列合二为一(如 zipper )

java - EJB 3.1 依赖注入(inject)失败