繁体   English   中英

在 CRAN 包中包含非 CRAN 包

[英]Include non-CRAN package in CRAN package

问题很简单。 第一的:

  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"
)

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


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

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

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

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

您需要在描述文件中使用Additional_repositories字段。 在这一领域提供的位置必须包含期望的目录结构, PACKAGES文件中的相应目录,并PACKAGES文件必须有非CRAN包装上市。


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

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

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")

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

available.packages(repos=file.path("file:/",getwd()))

它应该在那里列出您的非 CRAN 包。 然后在 R 存储库中发布非 CRAN 包,您应该将存储库定位到 CRAN 包的Additional_repositories字段中。 在这种情况下,位置将是由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"
)

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

Additional_repositories http://datacube.wu.ac.at

有可能,但是! ...

DESCRIPTION文件中有一个字段可供您使用:

Additional_repositories: http://ghrr.github.io/drat

但!

依赖于功能从附加存储库中的一切必须是绝对可选

所以来自这个 repo 的包应该放在Suggests下。

例子

我不能 100% 确定 BioConductor 和 OmegaHat 是否被认为是主流。

usethis::use_dev_package函数解决了这个问题。

例如,运行此行:

usethis::use_dev_package(package = "h3", type = "Imports", remote = "crazycapivara/h3-r")

将自动将以下行写入您的DESCRIPTION文件:

Imports: 
    h3 (>= 3.7.1)
Remotes:  
    crazycapivara/h3-r

请注意,因为 github 是 R 中最常用的非官方包分发,所以它是默认的。 因此,请确保DESCRIPTION文件的Remotes部分中的条目没有github::前缀。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM