【问题标题】:Is there a new solution for downloading package and dependencies for a given R version是否有用于下载给定 R 版本的包和依赖项的新解决方案
【发布时间】:2025-12-01 16:55:01
【问题描述】:

我从 2018 年看到here 提出的问题。我想知道今天是否有更好的答案。

我们的工作计算机被整个 IT 安全部门所困扰,似乎存在使它们无用的情况。我们可以运行 R 3.6.3(4.x 尚未获得批准)。我们无法从公司防火墙后面连接到 CRAN。在过去,这意味着我们将笔记本电脑带回家安装软件包。但是现在我们有了一个下载监视器,即使我们使用自己的 wi-fi 也可以阻止 CRAN 下载。

我试图通过在个人计算机上下载压缩包 .zip 文件,通过 CD 传输它们,然后使用 repos=NULL 安装来解决此问题。我用了这段代码

getPackages <- function(packs){
  packages <- unlist(
    tools::package_dependencies(packs, available.packages(),
                         which=c("Depends", "Imports"), recursive=TRUE)
  )
  packages <- union(packs, packages)
  packages
}

获取我想要的包的依赖项并使用download.packages() 将它们全部下载。我试图安装tidyquant,结果发现有113个依赖项。

当然,这会下载所有 113 个包的最新版本,其中一些包与 R 3.6.3 不兼容。

我上面提到的解决方案建议找到兼容的版本,然后使用

install_version("<package name>",
                version = "<version number>",
                repos = "http://cran.us.r-project.org")

但这将涉及手动搜索所有 113 个依赖项...另外,我正在寻找一个通用解决方案,我可以与我办公室中的大约 10 个其他人共享,他们现在都有这个问题。

我希望自 2018 年以来可能会出现更好的解决方案?

更新: 根据下面的答案,我尝试过

tmp <- tempfile()
dir.create(tmp)

checkpoint::checkpoint(snapshot_date = "2020-04-01", 
                       r_version = "3.6.3", 
                       checkpoint_location = tmp,
                       scan_now = FALSE)


packages <- getPackages(c("tidyquant"))

download.packages(packages, destdir="C:\\Users\\jerem\\Downloads\\tidyquant", type="win.binary")

我明白了

Running create_checkpoint in the home directory may result
in checkpointing very many packages. Continue? (Y/n) Y

Creating checkpoint directory C:/Users/jerem/AppData/Local/Temp/Rtmpa2YEjU/file1efc6daf58e3/.checkpoint/2020-04-01/lib/x86_64-w64-mingw32/3.6.3
Using checkpoint directory C:/Users/jerem/AppData/Local/Temp/Rtmpa2YEjU/file1efc6daf58e3/.checkpoint/2020-04-01/lib/x86_64-w64-mingw32/3.6.3
Warning messages:
1: In create_checkpoint(snapshot_date, r_version, checkpoint_location,  :
  Specified R version not the same as current R version
2: In use_checkpoint(snapshot_date, r_version, checkpoint_location,  :
  Specified R version not the same as current R version
> 
> packages <- getPackages(c("tidyquant"))
> 
> download.packages(packages, destdir="C:\\Users\\jerem\\Downloads\\tidyquant", type="win.binary")
Warning: unable to access index for repository https://mran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/4.1:
  cannot open URL 'https://mran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/4.1/PACKAGES'
Warning in download.packages(packages, destdir = "C:\\Users\\jerem\\Downloads\\tidyquant",  :
  no package ‘tidyquant’ at the repositories
Warning in download.packages(packages, destdir = "C:\\Users\\jerem\\Downloads\\tidyquant",  :
  no package ‘lubridate’ at the repositories
Warning in download.packages(packages, destdir = "C:\\Users\\jerem\\Downloads\\tidyquant",  :
  no package ‘PerformanceAnalytics’ at the repositories

所有 113 个依赖项都会出现“无包”警告。

我认为这里的关键是

Warning: unable to access index for repository https://mran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/4.1:

显然,2020 年 4 月不会有 4.1 存储库。我认为它正在尝试这样做,因为机器运行的是 4.1。所以看起来我们已经非常接近了....

如果有帮助

> sessionInfo()
R version 4.1.2 (2021-11-01)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 22000)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    
system code page: 65001

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_4.1.2   tools_4.1.2      checkpoint_1.0.2

【问题讨论】:

  • 你可以使用 conda,这就是我必须做的。我不得不为某些库使用 4.0 版本。我为 R 版本制作了单独的 conda 环境并安装了依赖项
  • 我并没有真正使用过,不过不妨看看网上的RStudio Package Manager。您可以将其修复到某个时间点并在该日期下载软件包。

标签: r package cran


【解决方案1】:

我不确定它是否完全满足您的需求,但包checkpoint 似乎适合这里。它允许您从在指定日期拍摄的 CRAN 快照下载源包,返回到 2014-09-17。 R 4.0.0 是在 2020-04-24 周围发布的,所以来自 2020-04-01 的快照应该可以满足您的目的。

这是一个可重现的例子:

tmp1 <- tempfile()
dir.create(tmp1)
cwd <- setwd(tmp1)

getOption("repos")
##                           CRAN 
## "https://cloud.r-project.org/"

available.packages()[c("lattice", "Matrix", "nlme"), c("Version", "Repository")]
##         Version   Repository                               
## lattice "0.20-45" "https://cloud.r-project.org/src/contrib"
## Matrix  "1.4-0"   "https://cloud.r-project.org/src/contrib"
## nlme    "3.1-155" "https://cloud.r-project.org/src/contrib"

download.packages("Matrix", ".", type = "source")
## trying URL 'https://cloud.r-project.org/src/contrib/Matrix_1.4-0.tar.gz'
## Content type 'application/x-gzip' length 2849865 bytes (2.7 MB)
## ==================================================
## downloaded 2.7 MB
## 
##      [,1]     [,2]                   
## [1,] "Matrix" "./Matrix_1.4-0.tar.gz"

tmp2 <- tempfile()
dir.create(tmp2)
checkpoint::checkpoint(snapshot_date = "2020-04-01", 
                       r_version = "3.6.3", 
                       checkpoint_location = tmp2,
                       scan_now = FALSE)
## Creating checkpoint directory /var/folders/n7/v9s56rmd5hn17d3f1qj13l7m0000gn/T//RtmpbrT5Br/filee2045e35c290/.checkpoint/2020-04-01/lib/aarch64-apple-darwin20/3.6.3
## Using checkpoint directory /private/var/folders/n7/v9s56rmd5hn17d3f1qj13l7m0000gn/T/RtmpbrT5Br/filee2045e35c290/.checkpoint/2020-04-01/lib/aarch64-apple-darwin20/3.6.3
## Warning messages:
## 1: In create_checkpoint(snapshot_date, r_version, checkpoint_location,  :
##   Specified R version not the same as current R version
## 2: In use_checkpoint(snapshot_date, r_version, checkpoint_location,  :
##   Specified R version not the same as current R version

getOption("repos")
##                                             CRAN 
## "https://mran.microsoft.com/snapshot/2020-04-01"

available.packages()[c("lattice", "Matrix", "nlme"), c("Version", "Repository")]
##         Version   Repository                                                  
## lattice "0.20-40" "https://mran.microsoft.com/snapshot/2020-04-01/src/contrib"
## Matrix  "1.2-18"  "https://mran.microsoft.com/snapshot/2020-04-01/src/contrib"
## nlme    "3.1-145" "https://mran.microsoft.com/snapshot/2020-04-01/src/contrib"

download.packages("Matrix", ".", type = "source")
## trying URL 'https://mran.microsoft.com/snapshot/2020-04-01/src/contrib/Matrix_1.2-18.tar.gz'
## Content type 'application/octet-stream' length 1871705 bytes (1.8 MB)
## ==================================================
## downloaded 1.8 MB
## 
##      [,1]     [,2]                    
## [1,] "Matrix" "./Matrix_1.2-18.tar.gz"

setwd(cwd)
unlink(c(tmp1, tmp2), recursive = TRUE)

如果您实际上并未运行 R 3.6.3,则会出现有关版本不匹配的警告。如果您只是下载源包,则可以忽略它们,目的是将它们安装在另一台实际运行 3.6.3 的机器上。

您可以查看包README?checkpoint 了解更多详情。

更新

如果您尝试下载二进制包(.zip for Windows,.tgz for macOS)而不是source包(.tar.gz),那么@ 987654333@ 会给你带来麻烦。默认情况下,download.packages 和朋友使用contrib.url(repos, type) 构造一个 URL 来搜索包二进制文件。

contrib.url("https://mran.microsoft.com/snapshot/2020-04-01/src/contrib", "win.binary")
## [1] "https://mran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/4.1"

contrib.url("https://mran.microsoft.com/snapshot/2020-04-01/src/contrib", "mac.binary")
## [1] "https://mran.microsoft.com/snapshot/2020-04-01/bin/macosx/contrib/4.1"

但是两个 URL 都没有。那是(部分)因为contrib.url 附加了您当前正在运行的 R 版本,在您的快照日期可能不存在。因此:

download.packages("Matrix", ".", type = "win.binary")
## Warning: unable to access index for repository https://mran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/4.1:
##   cannot open URL 'https://mran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/4.1/PACKAGES'
## Warning in download.packages("Matrix", ".", type = "win.binary") :
##   no package 'Matrix' at the repositories
##      [,1] [,2]

download.packages("Matrix", ".", type = "mac.binary")
## Warning: unable to access index for repository https://mran.microsoft.com/snapshot/2020-04-01/bin/macosx/contrib/4.1:
##   cannot open URL 'https://mran.microsoft.com/snapshot/2020-04-01/bin/macosx/contrib/4.1/PACKAGES'
## Warning in download.packages("Matrix", ".", type = "mac.binary") :
##   no package 'Matrix' at the repositories
##      [,1] [,2]

您实际需要的网址是:

## Windows
"https://cran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/3.6"

## macOS, OS X, whatever
"https://cran.microsoft.com/snapshot/2020-04-01/bin/macosx/el-capitan/contrib/3.6"

在这种情况下,最好的方法可能是完全避免checkpoint,直接将有效的URL传递给available.packagesdownload.packages

pkg <- "tidyquant"
contriburl <- "https://cran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/3.6"

db <- available.packages(contriburl)
deps <- tools::package_dependencies(pkg, db, recursive = TRUE)[[pkg]]
download.packages(c(pkg, deps), ".", contriburl = contriburl, type = "win.binary")

【讨论】:

  • 这听起来很理想......但是当我尝试它时,我收到一堆关于指定 R 版本与当前版本不匹配的警告,但 getOption"repos") 确实返回 https://mran.microsoft.com/snapshot/2020-04-01。但是,当我尝试运行 download.packages() 时,我得到了 Warning: unable to access index for repository https://mran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/4.1: cannot open URL 'https://mran.microsoft.com/snapshot/2020-04-01/bin/windows/contrib/4.1/PACKAGES,这是有道理的,因为当时没有 4.1 版......不知道如何继续
  • 如果您只是在机器上下载二进制文件,然后将它们安装在实际运行 R 3.6.3 的机器上,r_version = "3.6.3" 的警告就可以了。除非我误解了...查看您尝试过的代码和您的sessionInfo() 会有所帮助。 FWIW,我在运行 R 4.1.2 的机器上运行了我的示例中的所有代码,没有任何问题......
  • 用我尝试时会发生什么的信息更新了 OP....
  • 谢谢,我会在今天晚些时候尝试深入研究。
  • 我已经更新了答案。您不需要checkpoint,只要将正确的contriburl 传递给both available.packagesdownload.packages。顺便说一句,您可以考虑在调用package_dependencies 时使用默认的which = "strong",或等效的which = c("Depends", "Imports", "LinkingTo")。是否需要LinkingTo 取决于包,如果您不确定,那么可能值得保留。据我统计,它为您的 87 个添加了 14 个依赖项。