如何在最新版的R 中迁移旧版本已安装的包

编程语言 2026-07-09

我现在使用的版本是R 4.5.2,正在安装最新版本的R 4.6.0。

如何将已在旧版本中安装的包迁移到新版本?以下是我的尝试:

我获取并保存了旧版本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)

然后我在新版本的R 中运行以下代码,只从CRAN安装包,因为txt文件中也包含了一些来自Github的包。

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" 时的输出:

There are binary versions available but the source versions are later:
  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

解决方案

这可能就是你想要的。

inst_pack <- function(x, lib = .libPaths()[1], ncpus = 1L){
  utils::install.packages(
    pkgs = x,
    lib = lib,
    repos = "https://cloud.r-project.org",
    Ncpus = ncpus
  )
}

## Default repo
local({r <- getOption("repos")
r["CRAN"] <- "https://cran.r-project.org" 
options(repos=r)
})

#
inst_pkgs <- installed.packages(priority = "NA")
inst_pkgname <- inst_pkgs[, "Package"]
inst_version <- inst_pkgs[, "Version"] |> package_version()
#
avail_pkgs <- available.packages(repos = "https://cloud.r-project.org")
avail_pkgname <- avail_pkgs[, "Package"]
avail_version <- avail_pkgs[, "Version"] |> package_version()

i <- which(avail_pkgname %in% inst_pkgname)
j <- which(inst_pkgname %in% avail_pkgname)

sum(avail_version[i] > inst_version[j])
i_update <- which(avail_version[i] > inst_version[j])

ncores <- 1L
# with so many packages to update, it might be a good idea
# to use this instead of 'ncores <- 1L'
# ncores <- parallel::detectCores() - 2L
to_update <- avail_pkgname[i][i_update]
inst_pack(to_update, ncpus = ncores)

当我运行这个时,我得到了以下信息。

  There are binary versions available but the source versions are later:
           binary source needs_compilation
devtools    2.5.1  2.5.2             FALSE
fabletools  0.6.1  0.7.0             FALSE
roxygen2    7.3.3  8.0.0              TRUE
secretbase  1.2.1  1.2.2              TRUE

而且这些包的最新版本都是从源码安装的。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章