[英]Install a local R package with dependencies from CRAN mirror
我已经构建了一个 R package,即我有 mypackage.tar.gz 文件。 这个 package 依赖于其他几个包,所有包都可以从任何 CRAN 镜像下载和安装。
现在我想在尚未安装依赖项的系统上安装这个 package,我希望在安装我的 package 时自动下载并安装依赖项。
我试过了:
install.packages("mypackage.tar.gz",type="source",dependencies=TRUE,repos="http://a.cran.mirror")
但它在镜像上搜索mypackage.tar.gz
(显然它没有找到),而如果我设置repos=NULL
它正确地尝试安装本地 package 文件(如文档所述),但显然它没有找到依赖项包。
所以我的问题是:有没有办法执行“混合”安装(具有在线依赖项的本地 package)或者唯一的方法是手动安装所有依赖项?
您可以使用 devtools 包中的install
。 只需运行install("<directory of your package>", dependencies = TRUE)
。 它的帮助说明:
使用 R CMD INSTALL 安装包。 如果尚未安装,还将尝试从 CRAN 安装软件包的依赖项。
如果您已经安装了本地包,您应该能够使用工具中的几个函数来安装来自 CRAN 的依赖项:
library('tools')
installFoundDepends(pkgDepends('mypackage', local = FALSE)$Found)
注意:您可以通过installFoundDepends
将 args(如repos
)传递给install.packages
。
您还可以使用pkgDepends
输出中的Depends
元素直接传递给install.packages
:
install.packages(pkgDepends('mypackage')$Depends)
更新:显然不可能安装带有dependencies=FALSE
的本地包。 这看起来很奇怪,因为您可以对存储库中的远程包执行此操作。 原因( 查看源代码)是if(is.null(repos) & missing(contriburl))
,安装是通过系统调用R CMD INSTALL
来处理的,它没有与依赖相关的参数。
在这里,我将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=BiocManager::repositories())
注意:我不知道如何将 tarball 直接传递给install()
,但此解决方案在此期间有效并且不会造成混乱,因为我们提取到临时目录。 似乎install_local()
应该能够获取 tarball,但是在尝试这样做时出现错误。
我个人使用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开始安装所有依赖项。
注意:请记住,这两个'
写在上面的脚本是不同的,您复制此脚本的第一次,我劝再次复制原始引号字符。
如果您不反对使用另一个 package 来为您管理,现在可以使用 {remotes} package 轻松实现。
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.table\n", 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"
并修改路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.