我已经构建了一个R包,即我有mypackage.tar.gz文件。此软件包依赖于其他几个软件包,所有这些软件包都可以从任何CRAN镜像下载和安装。
现在我想在尚未安装依赖项的系统上安装此软件包,并且我希望在安装软件包时自动下载并安装依赖项。
我试过了:
install.packages("mypackage.tar.gz",type="source",dependencies=TRUE,repos="http://a.cran.mirror")
但它在镜像上搜索mypackage.tar.gz
(显然它没有找到(,而如果我设置repos=NULL
它正确尝试安装本地包文件(如文档所述(,但显然它找不到依赖项包。
所以我的问题是:有没有办法执行"混合"安装(具有在线依赖项的本地包(或唯一的方法是手动安装所有依赖项?
您可以使用 devtools 包中的install
。只需运行install("<directory of your package>", dependencies = TRUE)
.它的帮助指出:
使用 R CMD INSTALL 安装软件包。还将尝试从 CRAN 安装包的依赖项(如果尚未安装(。
在这里,我将untar()
与devtools::install()
一起使用,并传入已将源压缩包解压缩到的目录。
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=BiocManager::repositories())
注意:我不知道如何将压缩包直接传递给install()
,但是此解决方案在此期间有效并且不会留下混乱,因为我们提取到临时目录。似乎install_local()
应该能够拿一个压缩包,但是我在尝试这样做时遇到了错误。
如果您已经安装了本地软件包,您应该能够在工具中使用几个函数来安装 CRAN 中的依赖项:
library('tools')
installFoundDepends(pkgDepends('mypackage', local = FALSE)$Found)
注意:您可以通过 installFoundDepends
传递参数(如 repos
install.packages
(。
您还可以使用 pkgDepends
输出中的 Depends
元素直接传递给 install.packages
:
install.packages(pkgDepends('mypackage')$Depends)
更新:显然不可能安装带有dependencies=FALSE
的本地软件包。这似乎很奇怪,因为您可以从存储库对远程包执行此操作。原因(查看源代码(是if(is.null(repos) & missing(contriburl))
,安装是通过对R CMD INSTALL
的系统调用来处理的,它没有与依赖相关的参数。
如果您不反对使用另一个为您管理此软件包的软件包,那么现在可以使用 {remotes} 软件包轻松实现这一点。
install.packages("remotes")
remotes::install_local("mypackage.tar.gz")
您可以指定一些您想要的依赖项的其他选项(例如,"建议"中的依赖项(等:
?remotes::install_local
{remotes} 本身没有依赖项 AFAIK,因此它不会给您的环境增加太多混乱。
如此古老的问题和如此多的答案,但不幸的是,它们都没有提出解决问题的规范方法。R被设计用于处理这样的情况,不需要额外的包。必须创建本地存储库,然后在安装时将其与CRAN url一起使用作为存储库源。下面是呈现完整过程的代码。
## double check our dependency is not yet installed
## remove.packages("data.table")
"data.table" %in% rownames(installed.packages())
#[1] FALSE
## create our pkg
hello = function() "world"
package.skeleton(name="pkg", list="hello")
#...
cat("Imports: data.tablen", file="pkg/DESCRIPTION", append=TRUE)
unlink(c("pkg/Read-and-delete-me", "pkg/man"), recursive=TRUE)
rm(hello)
## publish our pkg in current working directory
system("R CMD build pkg")
#...
dir.create("src/contrib", recursive=TRUE)
file.rename("pkg_1.0.tar.gz", "src/contrib/pkg_1.0.tar.gz")
#[1] TRUE
tools::write_PACKAGES("src/contrib")
## install pkg and its dependencies automatically
install.packages("pkg", repos=c(
paste0("file://", getwd()),
"https://cloud.r-project.org"
))
#Installing package into '/home/jan/R/x86_64-pc-linux-gnu-library/4.2'
#(as 'lib' is unspecified)
#also installing the dependency 'data.table'
#...
## test
library(pkg)
hello()
#[1] "world
"data.table" %in% rownames(installed.packages())
#[1] TRUE
在Windows上,可能需要指定type="source"
和修改路径。