在CRAN包中包含非CRAN包

Tyl*_*ker 12 r package cran

问题很简单.第一:

  1. 是否可以在CRAN包中包含非CRAN(或bioconductor或omega hat)包,并在实例中实际使用该包中的工具.
  2. 如果是,如何设置DESCRIPTION文件等以使其合法并通过CRAN检查?

具体来说,我问的是曾经是CRAN包的openNLPmodels.en.它非常有用,并希望包含它的功能.我可以做一个解决方法,而不是在示例中实际使用openNLPmodels.en或为它创建单元测试,并在函数使用时安装它(类似于性别包如何安装它需要的数据集)但我会我喜欢一种允许我运行检查,文本和示例的方法.

这是下载和安装openNLPmodels.en的方法

install.packages(
    "http://datacube.wu.ac.at/src/contrib/openNLPmodels.en_1.5-1.tar.gz",  
    repos=NULL, 
    type="source"
)
Run Code Online (Sandbox Code Playgroud)

jan*_*cki 1

现有的答案很好,但没有详细解释整个过程,因此发布这个答案。


是否可以在 CRAN 包中包含非 CRAN(或生物导体或 omega hat)包,并在示例中实际使用该包中的工具。

对的,这是可能的。此类非 CRAN 的任何使用(包代码、示例、测试、小插图)都必须像Suggests中的任何其他包一样进行转义,最好使用

if (requireNamespace("non.cran.pkg", quietly=TRUE)) {
  non.cran.pkg::fun()
} else {
  cat("skipping functionality due to missing Suggested dependency")
}
Run Code Online (Sandbox Code Playgroud)

如果是,如何设置描述文件等以使其合法并通过 CRAN 检查?

您需要使用Additional_repositories描述文件中的字段。该字段中提供的位置必须包含预期的目录结构、PACKAGES适当目录中的文件,并且PACKAGES文件必须列出非 CRAN 包。


现在转到您的特定openNLPmodels.en包示例。根据您下载和安装此软件包的方式,将无法将其用作依赖项并传递给 CRAN。openNLPmodels.en必须以 R 存储库预期的结构发布。否则,您将没有有效的位置可放入Additional_repositories字段中。

您可以做的是下载非 CRAN 包并自行将其发布到 R 存储库中,然后在Additional_repositoriesCRAN 包中的字段中使用该位置。以下是如何执行此操作的示例:

dir.create("src/contrib", recursive=TRUE)
download.file("http://datacube.wu.ac.at/src/contrib/openNLPmodels.en_1.5-1.tar.gz", "src/contrib/openNLPmodels.en_1.5-1.tar.gz")
tools::write_PACKAGES("src/contrib")
Run Code Online (Sandbox Code Playgroud)

我们只是将包源放在预期的目录中src/contrib,其余的由write_PACKAGES函数很好地处理。为了确保正确创建存储库,您可以列出该存储库中可用的包:

available.packages(repos=file.path("file:/",getwd()))
Run Code Online (Sandbox Code Playgroud)

它应该在那里列出您的非 CRAN 软件包。然后在 R 存储库中发布非 CRAN 包,您应该将存储库位置放入Additional_repositoriesCRAN 包的字段中。在这种情况下,位置将是file.path("file:/",getwd())表达式返回的位置。

请注意,它使用本地计算机上的位置,您可能希望将其放在网上,以便检查 CRAN 包的任何计算机都可以访问 url,包括对 CRAN 本身的检查。为此,只需将您的src目录移动到将托管在某个在线位置的公共目录,并使用该服务器的位置。


现在再次查看您的非 CRAN 包,我们可以看到它的 url 中有src/contrib,因此我们可以假设它已经存在适当的 R 存储库,并且我们不必创建和发布新的存储库。因此您的安装说明可能如下所示

install.packages(
  "openNLPmodels.en", 
  repos="http://datacube.wu.ac.at",
  type="source"
)
Run Code Online (Sandbox Code Playgroud)

然后,您的 CRAN 包所需的就是使用可用的现有存储库

Additional_repositories http://datacube.wu.ac.at
Run Code Online (Sandbox Code Playgroud)