我已经构建了一个R包,即我有mypackage.tar.gz文件。此软件包依赖于其他几个软件包,所有软件包均可从任何CRAN镜像下载和安装。
现在我想在尚未安装依赖项的系统上安装此软件包,我希望在安装软件包时自动下载并安装依赖项。
我试过了:
install.packages("mypackage.tar.gz",type="source",dependencies=TRUE,repos="http://a.cran.mirror")
但它在镜像上搜索mypackage.tar.gz
(显然它找不到),而如果我设置repos=NULL
它正确地尝试安装本地包文件(如文档所示),但显然它找不到依赖包。
所以我的问题是:有没有办法执行'混合'安装(具有在线依赖的本地包)或唯一的方法是手动安装所有依赖项?
答案 0 :(得分:7)
您可以使用devtools包中的install
。只需运行install("<directory of your package>", dependencies = TRUE)
。它的帮助说明:
使用R CMD INSTALL安装软件包。还将尝试从CRAN安装软件包的依赖项,如果它们尚未安装。
答案 1 :(得分:5)
如果您已经安装了本地软件包,则应该可以在工具中使用几个函数来安装CRAN的依赖项:
library('tools')
installFoundDepends(pkgDepends('mypackage', local = FALSE)$Found)
注意:您可以将repos
)installFoundDepends
传递给install.packages
。
您还可以使用Depends
输出中的pkgDepends
元素直接传递到install.packages
:
install.packages(pkgDepends('mypackage')$Depends)
更新:显然无法使用dependencies=FALSE
安装本地软件包。这看起来很奇怪,因为您可以从存储库中为远程包执行此操作。原因(looking at the source code)是if(is.null(repos) & missing(contriburl))
,安装是通过对R CMD INSTALL
的系统调用来处理的,{{1}}没有与依赖项相关的参数。
答案 2 :(得分:2)
在这里,我使用untar()
与devtools::install()
并传入已提取源tarball的目录。
d <- tempdir()
untar("mypackage.tar.gz", compressed="gzip", exdir=d)
devtools::install(file.path(d, "mypackage"), dependencies=TRUE,
repos="https://cloud.r-project.org/")
如果您想从多个仓库安装,您可以提供它们的列表。例如,要同时使用Bioconductor和CRAN,您可以运行:
devtools::install(file.path(d, "mypackage"), dependencies=TRUE,
repos=BiocInstaller::biocinstallRepos())
注意:我无法弄清楚如何直接将tarball传递给install()
,但是这个解决方案同时起作用并且不会因为我们提取到临时目录而没有混乱。似乎install_local()
应该可以使用tarball,但是在尝试这样做时我遇到了错误。
答案 3 :(得分:0)
我个人使用RStudio来告诉你缺少哪些依赖项。然后我在下面的小脚本的参数中复制字符串来改变经典的“奇怪”符号“(xclip正在复制到剪贴板[就像在macOS上的pbcopy])。
#!/bin/bash
echo $@ | sed 's/‘/"/g' | sed 's/’/"/g' | xclip -selection clipboard
然后我只使用install.packages(c(ctrl_v__what_to_install))
并且R开始安装所有依赖项。
注意:请记住上面脚本中写的两个‘
是不同的,第一次复制这个脚本时,我建议再次复制原始引号字符。