【问题标题】:Include non-CRAN package in CRAN package在 CRAN 包中包含非 CRAN 包
【发布时间】:2016-01-24 22:29:05
【问题描述】:

这个问题很简单。第一:

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

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

这是下载和安装 openNLPmodels.en

的方式
install.packages(
    "http://datacube.wu.ac.at/src/contrib/openNLPmodels.en_1.5-1.tar.gz",  
    repos=NULL, 
    type="source"
)

【问题讨论】:

  • 我不确定这是否是 Stack Overflow 的主题……对于 r-packages-devel 列表可能更好(不确定它到底叫什么)……?跨度>
  • "CRAN 包所依赖的包应该可以从主流存储库中获得:如果“建议”或“增强”字段中提到的任何内容不是来自这样的存储库,从哪里获得它们应在说明文件的“Additional_repositories”字段(以逗号分隔的存储库 URL 列表)或“说明”字段中描述的其他访问方式指定在存储库中的位置。" cran.rstudio.org/web/packages/policies.html
  • 这听起来是个坏主意。你为什么不复制你需要的功能呢?是开源的吗?或与openNLPmodels.en 的作者交谈,看看你是否可以采用或分叉它?

标签: r package r-package cran


【解决方案1】:

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:: 前缀。

【讨论】:

    【解决方案2】:

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


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

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

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

    如果是,如何设置DESCRIPTION文件等以使其合法并通过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 目录移动到 public 目录,该目录将在线托管并使用该服务器的位置。


    现在再次查看您的非 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
    

    【讨论】:

      【解决方案3】:

      有可能,但是! ...

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

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

      但是!

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

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

      Example

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-01
        • 2021-08-12
        • 2016-07-13
        相关资源
        最近更新 更多