我正在创建我的第一个R包,我正在尝试包含包依赖项。该软件包在我的机器上安装并正常运行,但我已经安装了所有依赖项。当另一个用户尝试安装并且他们没有安装所有依赖项时,他们会收到错误。
ERROR: dependency 'dplyr' is not available for package 'my_package'
我正通过roxygen2
记录包裹。
我知道我应该在#'@import
个文件中添加/R
行,并自动添加到DESCRIPTION
和NAMESPACE
个文件中。
我的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")
我已阅读过有关此主题的回答说,在DESCRIPTION
和NAMESPACE
中使用正确的import语句应该是记录依赖关系所需的全部内容,我在这里。我安装的大多数CRAN软件包的行为是,如果存在未安装的依赖项,它将与安装一起安装。我缺少哪些步骤以便我的包模仿这种行为?
答案 0 :(得分:2)
根据我的经验,在开发第一个软件包时,一个好的策略是检查其他软件包的工作。最简单的方法是在Github上检查一些你最喜欢的包。例如,这是我的一个描述文件的一部分:
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 for packages。
完成设置后,您可以运行:
# This should point to the folder of your DESCRIPTION file
setwd("/path/to/your/package/")
roxygen2::roxygenise(clean = TRUE)
请勿直接更改NAMESPACE!这应该足以安装你的软件包或将它放在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 lin
devtools::install_url("file:///C:/custom_packages/my_package_0.0.0.9000.tar.gz")