【问题标题】:Adding dependencies properly to an r package, so that they install automatically将依赖项正确添加到 r 包,以便它们自动安装
【发布时间】:2018-03-27 17:02:02
【问题描述】:

我正在制作我的第一个 R 包,并且我正在尝试包含包依赖项。该软件包在我的机器上安装并运行良好,但我已经安装了所有依赖项。当另一个用户尝试安装并且他们没有安装所有依赖项时,他们会收到错误消息。

ERROR: dependency 'dplyr' is not available for package 'my_package'

我正在通过roxygen2 记录包。

我知道我应该在我的/R 文件中包含#'@import 行,它们会自动添加到DESCRIPTIONNAMESPACE 文件中。

我的DESCRIPTION 文件如下所示:

Package: my_package
Title: What the Package Does (one line, title case)
Version: 0.0.0.9000
Authors@R: person("First", "Last", email = "first.last@example.com", role = c("aut", "cre"))
Description: What the package does (one paragraph).
Depends: R (>= 3.4.1)
License: What license is it under?
Encoding: UTF-8
LazyData: true
RoxygenNote: 6.0.1
Imports: dplyr,
    descr

而我的NAMESPACE 看起来像这样:

export(my_function)
import(descr)
import(dplyr)

用户正在本地安装包:

install.packages("C:/custom_packages/my_package_0.0.0.9000.tar.gz/", repos = NULL, type = "source")

我读过的关于这个主题的答案说,在DESCRIPTIONNAMESPACE 中拥有正确的导入语句应该是您记录依赖关系所需的全部内容,我在这里有。我安装的大多数 CRAN 软件包的行为是,如果有一个未安装的依赖项,它会与安装一起安装。我遗漏了哪些步骤以使我的包模仿这种行为?

【问题讨论】:

  • install.packages 将在 repos 参数设置为 CRAN 存储库时自动安装所有依赖项(它比这更细微,但请耐心等待)。设置repos = NULL 后,用户已切断对可以从中下载依赖项的存储库的访问。您可能需要考虑将源代码放在共享驱动器上并使用devtools::install_local 而不是install.packages。但从根本上说,您的包结构没有任何问题。
  • 这很有帮助,很好的解释! install_local() 似乎是我在这里所缺少的。

标签: r r-package roxygen2


【解决方案1】:

根据我的经验,在开发您的第一个软件包时,一个好的策略是检查其他人的工作。最简单的方法是在 Github 上查看一些你最喜欢的包。例如,这里是我的一个DESCRIPTION文件的一部分:

Depends: 
  R (>= 3.3.0)
License: GPL-3
Imports: 
  stringi (>= 1.1.7), 
  data.table (>= 1.10.4.3),
  methods (>= 3.3.0),
  quanteda (>= 1.1.0),
  scales (>= 0.5.0),
  stats (>= 3.3.0),
  utils (>= 3.3.0)

如您所见,每个包都有一个最小版本(其中大多数只是我使用的版本,但对于一些,我测试了旧版本是否可以工作)。我使用 Imports 来标记包,并 Depends 仅用于指示我成功测试的最旧的 R 版本。对于包,您几乎应该总是使用 Imports 或 Suggests 而不是 Depends。

设置完成后,您可以运行:

# This should point to the folder of your DESCRIPTION file    
setwd("/path/to/your/package/")  
roxygen2::roxygenise(clean = TRUE)

不要直接改变命名空间!这应该足以安装您的包或将其放在 GitHub 上。

但是,这只是冰山一角,最好先查看this post,然后在this book 中阅读详细信息。

更新:鉴于@Benjamin 的评论,我发现我错过了您问题的一部分。 repos = NULL, type = "source" 禁止安装依赖项。更好的方法是使用devtools。我不确定这是否是正确的方法,但是当我已经有一个 tarball 并需要安装它时,我会使用类似的东西:

# In Windows use copy and paste directly on the file to get a link  
devtools::install_url("C:/custom_packages/my_package_0.0.0.9000.tar.gz")

【讨论】:

  • 我为您的问题添加了更具体的答案
  • 是的,install_localinstall_url() 似乎是我完成这项工作所缺少的。感谢您的编辑,已接受答案:)。
猜你喜欢
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
  • 2017-01-31
  • 1970-01-01
  • 2023-04-07
  • 2016-11-08
  • 2012-06-04
相关资源
最近更新 更多