我正在开发我的第一个R包(使用R 2.13,Ubuntu 10.10)。我们称之为 foo ,让我们说R /目录中的代码以行库(bar)开头,其中 bar 是现有的在CRAN中的包, foo 所依赖的包。我的DESCRIPTION文件包含以下行:
Depends: bar
当包 foo 准备好进行测试时,我会使用以下方式在本地安装
R CMD INSTALL foo_1.0.tar.gz
但是,如果未安装 bar ,我会看到:
ERROR: dependency ‘bar’ is not available for package ‘foo’
显然,如果我的 foo 是使用install.packages()从CRAN安装的,那么 bar 将同时安装。所以我的问题是:当我使用R CMD INSTALL安装我的软件包 foo 时,如果需要,如何确保安装CRAN软件包 bar ?这是配置脚本的工作吗?
答案 0 :(得分:17)
实际上,重新阅读R扩展指南,并不是说R CMD INSTALL会从CRAN获得依赖关系。 R中的install.packages()方法会这样做,但乍一看我不认为R CMD INSTALL会这样做。
你可以使用install.packages从.tar.gz安装,但你必须设置repos = NULL,然后这适用:
dependencies: logical indicating to also install uninstalled packages
on which these packages depend/suggest/import (and so on
recursively). Not used if repos = NULL.
我怀疑要做的是从DESCRIPTION文件中获取依赖项,然后运行R并在那些在干净环境中测试构建时执行install.packages()。
答案 1 :(得分:17)
幸运的是Devtools提供了一个简单的解决方案:install_deps()
install_deps(pkg =“。”,dependencies = logical,threads = getOption(“Ncpus”,1))
参数:
pkg:包描述,可以是路径或包名。看到 'as.package'了解更多信息依赖项:'logical'表示同时安装已卸载的软件包 这个'pkg'取决于/链接到/建议。见参数 'install.packages'的'依赖关系'。
threads:用于安装的并发线程数 依赖。如果是,则默认为选项'“Ncpus”'或'1' 未设置。
示例:
install_deps(".") install_deps("/path/to/package",dependencies="logical")
答案 2 :(得分:5)
我最后只使用bash here-document并指定了云镜像来查找依赖项:
sudo R --vanilla <<EOF
install.packages('forecast', repos='http://cran.us.r-project.org')
q()
EOF
R包是“预测”,我使用的云镜是http://cran.us.r-project.org。如果你想使用另一面镜子,这里都是:https://cran.r-project.org/mirrors.html
上面的内容对我来说是将R包装入AWS EMR bootstrap shell脚本。
答案 3 :(得分:4)
更新;到 2021 年 2 月,remotes 包可以解决问题,并且比 devtools 的占用空间小得多:
R -e "install.packages('remotes')"
R -e "remotes::install_local('/path/to/mypackage.tar.gz', dependencies=T)"
答案 4 :(得分:2)
与@Jonathan Le类似,但更适合脚本使用:
sudo R --vanilla -e 'install.packages("forecast", repos="http://cran.us.r-project.org")'
答案 5 :(得分:0)
执行此操作的机制是在depends
文件的DESCRIPTION
字段中添加条目。
Depends: bar
这将加载bar
库(如果已安装),否则将从CRAN安装。
Writing R extensions
手册的第1.1.1节中描述了这一点:http://cran.r-project.org/doc/manuals/R-exts.html#The-DESCRIPTION-file
答案 6 :(得分:0)
遵循Romain Rossi的想法,这是一个简单的shell脚本,它以您发送的方式安装每个参数(假设它是一个包):
#!/bin/sh
for f in $*
do
sudo R --vanilla -e "install.packages('"$f"', repos='http://cran.us.r-project.org')"
done