从CRAN镜像安装具有依赖关系的本地R包

WoD*_*oSc 46 dependencies packages r repository cran

我已经构建了一个R包,即我有mypackage.tar.gz文件.此程序包依赖于其他几个程序包,所有程序包均可从任何CRAN镜像下载和安装.

现在我想在尚未安装依赖项的系统上安装此软件包,并且我希望在安装软件包时自动下载和安装依赖项.

我试过了:

install.packages("mypackage.tar.gz",type="source",dependencies=TRUE,repos="http://a.cran.mirror")
Run Code Online (Sandbox Code Playgroud)

但它mypackage.tar.gz在镜像上搜索(显然它没有找到),而如果我repos=NULL正确设置它尝试安装本地包文件(如文档所示),但显然它没有找到依赖包.

所以我的问题是:有没有办法执行'混合'安装(具有在线依赖的本地包)或唯一的方法是手动安装所有依赖项?

Emi*_*iel 8

你可以使用installdevtools包.只要运行install("<directory of your package>", dependencies = TRUE).它的帮助说明:

使用R CMD INSTALL安装软件包.如果尚未安装,还会尝试从CRAN安装软件包的依赖项.


Tho*_*mas 5

如果您已经安装了本地软件包,则应该能够在工具中使用几个函数来安装CRAN的依赖项:

library('tools')
installFoundDepends(pkgDepends('mypackage', local = FALSE)$Found)
Run Code Online (Sandbox Code Playgroud)

注意:您可以将args(like repos)传递installFoundDependsinstall.packages.

您还可以使用输出中的Depends元素pkgDepends直接传递给install.packages:

install.packages(pkgDepends('mypackage')$Depends)
Run Code Online (Sandbox Code Playgroud)

更新:显然无法安装本地软件包dependencies=FALSE.这看起来很奇怪,因为您可以从存储库中为远程包执行此操作.原因(查看源代码)是if(is.null(repos) & missing(contriburl)),安装是通过系统调用来处理的R CMD INSTALL,它没有依赖于相关的参数.

  • @WoDoSc好的,许多进一步的测试显示这真令人讨厌和令人惊讶.我实际上认为能够安装没有依赖关系的本地包是一个非常合理的功能请求R值得提交. (4认同)
  • 如果我尚未安装本地包的所有依赖项,则无法安装它。 (2认同)

Meg*_*ron 5

在这里,我使用untar()withdevtools::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/")
Run Code Online (Sandbox Code Playgroud)

如果要从多个存储库安装,可以提供它们的列表。例如,要同时使用Bioconductor和 CRAN,您可以运行:

 devtools::install(file.path(d, "mypackage"), dependencies=TRUE,
                   repos=BiocManager::repositories())
Run Code Online (Sandbox Code Playgroud)

注意:我不知道如何将 tarball 直接传递给install(),但此解决方案在此期间有效并且不会造成混乱,因为我们提取到临时目录。似乎install_local()应该可以使用 tarball,但是在尝试这样做时出现错误。