You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何快速将R 4.5.2的已安装包迁移至R 4.6.0?

R 版本升级后迁移已安装包的优化方案

背景与现有操作

从R 4.5.2升级到4.6.0后,尝试迁移旧版本已安装包,操作步骤如下:

1. 旧版本R导出包列表

pkg_current <- installed.packages() |>
  as.data.frame() |>
  dplyr::select(Package) |>
  tibble::remove_rownames()

write.table(pkg_current, file = "packages.txt", sep = "\t",
            row.names = T)

2. 新版本R从CRAN安装包

data.path <- "C:/Users/Documents/"
pkg_current <- file.path(data.path, "packages.txt")
pkg_current <- read.table(pkg_current)
str(pkg_current)

install.packages(
  pkg_current$Package,
  dependencies = TRUE,
  repos = c(CRAN = "https://cran.rstudio.com/"),
  type = "source"
)

遇到的问题

  • 1500+个包安装耗时超8小时仍未完成
  • 使用updateR()时出现「文件损坏」错误
  • 移除type = "source"后,R提示部分包有更新的源码版本:
存在可用的二进制版本,但源代码版本更新:
  binary source needs_compilation
  crs 0.15-41 0.15-42 TRUE 
  rfm 0.3.0 0.4.0 FALSE 
  devtools 2.5.1 2.5.2 FALSE 
  enrichwith 0.4.0 0.5.0 FALSE 
  fabletools 0.6.1 0.7.0 FALSE 
  fect 2.2.0 2.4.1 TRUE 
  kardl 1.3.0 1.3.1 FALSE 
  roxygen2 7.3.3 8.0.0 TRUE

优化解决方案

1. 优先安装二进制包

强制指定type = "source"是安装缓慢的核心原因——编译源码包需要大量时间。Windows/macOS环境下直接移除该参数,R会自动优先安装预编译的二进制包,仅在必要时编译源码包。如果确实需要少数更新的源码版本包,单独挑出来安装即可,无需全部编译。

2. 并行安装提速

利用多CPU核心并行安装,大幅缩短总耗时:

# 先安装remotes包(未安装的话)
install.packages("remotes")
# 指定4核并行安装,可根据自身CPU核心数调整
remotes::install_cran(pkg_current$Package, dependencies = TRUE, Ncpus = 4)

3. 跳过已安装的包

新版本R默认自带部分基础包,筛选出未安装的包再操作,减少重复工作:

# 获取新版本已安装包列表
installed_new <- installed.packages()[, "Package"]
# 筛选出需要安装的包
to_install <- setdiff(pkg_current$Package, installed_new)
# 安装目标包
install.packages(to_install, dependencies = TRUE)

4. 单独处理GitHub包

旧包列表中的GitHub包无法通过install.packages()安装,需单独导出并安装:

旧版本R中导出GitHub包列表

pkg_info <- installed.packages() |>
  as.data.frame() |>
  dplyr::select(Package, Repository)
# 筛选来源为GitHub的包
github_pkgs <- pkg_info[grepl("github", pkg_info$Repository, ignore.case = TRUE), "Package"]
write.table(github_pkgs, file = "github_packages.txt", sep = "\t", row.names = FALSE)

新版本R中安装GitHub包

github_pkgs <- read.table("github_packages.txt")$V1
# 需先安装devtools
install.packages("devtools")
devtools::install_github(github_pkgs)

5. 手动迁移包目录(替代updateR)

如果updateR()报错,可直接复制旧版本包目录到新版本,再批量更新不兼容的包:

  1. 找到旧版本包目录(示例:C:/Program Files/R/R-4.5.2/library
  2. 将目录中的包复制到新版本包目录(示例:C:/Program Files/R/R-4.6.0/library
  3. 在新版本R中运行以下命令,自动更新不兼容的包:
update.packages(checkBuilt = TRUE, ask = FALSE)

内容的提问来源于stack exchange,提问作者douseik

火山引擎 最新活动