1. 为什么要认真对待 R 与 RStudio 的版本更新
很多人装完 R 和 RStudio 之后,就再也没动过版本号,直到某天想装一个包,报错信息里赫然写着“package ‘xxx’ was built under R version 4.x.x”,或者 Bioconductor 的某个生信包死活装不上,才想起来该更新了。我自己就踩过这个坑:有一次跑单细胞转录组分析,需要用到某个依赖 R 4.3 以上版本的注释包,结果本地还是 R 4.1,折腾了一下午才发现问题出在版本太旧。
R 语言和 RStudio 是两个独立维护的软件。R 是底层解释器,负责实际的计算和包管理;RStudio 是集成开发环境,负责代码编辑、调试、绘图预览、项目管理这些交互层面的东西。两者更新节奏不同,更新方式也完全不一样。R 大概每半年发一个大版本(比如 4.3.x 到 4.4.x),中间会有若干小版本修 bug;RStudio 现在叫 Posit,更新频率更高,几乎每个月都有新版本,功能迭代和界面调整都比较频繁。
这篇文章面向所有使用 R 做数据分析的人,不管你是刚入门的新手,还是已经用了一段时间但一直没更新过的老用户。我会把 Windows、macOS、Linux 三个平台上的更新方法都讲清楚,重点解释为什么某些操作要那样做,以及更新过程中最容易出问题的地方在哪里。尤其是包迁移这个环节,很多人更新完 R 之后发现之前装的包全没了,又得一个个重装,其实有更省事的办法。
注意:更新 R 之前,务必确认你当前项目里没有正在运行的重要计算任务。更新过程中 R 会重启,未保存的工作空间会丢失。
2. 更新前的准备工作:别急着动手
2.1 先搞清楚你现在的版本状态
在终端或者 RStudio 的控制台里输入:
R.version.string这会告诉你当前 R 的版本号,比如 “R version 4.3.2 (2023-10-31)”。RStudio 的版本可以在菜单栏 Help > About RStudio 里看到,或者直接在控制台运行:
RStudio.Version()知道当前版本之后,去 CRAN(Comprehensive R Archive Network)看一下最新版本是多少。CRAN 是 R 的官方包仓库,所有正式发布的 R 版本都会在这里更新。打开浏览器访问 CRAN 官网,首页就会显示当前最新版本号。
2.2 记录你已安装的包列表
这一步是很多人忽略的关键操作。更新 R 之后,之前安装的第三方包不会自动迁移到新版本里。如果你不提前记录,更新完就得凭记忆一个个重装,非常痛苦。
# 把所有已安装的包名写入文件 installed_packages <- rownames(installed.packages()) write.csv(installed_packages, "my_packages.csv", row.names = FALSE)这个文件会保存在你当前的工作目录下。建议把它放到一个固定的位置,比如桌面或者文档文件夹,方便更新完之后找到。如果你用的是 renv 或者 pak 这类包管理工具,那恭喜你,包迁移会简单很多,后面我会专门讲。
2.3 备份重要的工作空间和脚本
虽然 R 的更新本身不会动你的脚本文件,但养成备份习惯总没错。特别是.RData文件(工作空间镜像)和.Rhistory(命令历史),如果你依赖这些文件恢复工作状态,最好复制一份到安全位置。
另外,如果你在 RStudio 里配置了很多自定义设置,比如主题、快捷键、代码片段,这些配置存在~/.config/rstudio/(Linux/macOS)或者%APPDATA%\RStudio\(Windows)目录下。RStudio 更新一般会保留这些配置,但跨大版本更新时偶尔会重置,提前备份一下更稳妥。
3. Windows 平台更新实操
3.1 更新 R:用 installr 包一键搞定
Windows 上更新 R 有一个非常方便的工具包叫installr,它可以自动完成下载、安装、包迁移的全过程。前提是你当前版本的 R 还能正常运行。
# 安装 installr 包 install.packages("installr") # 加载并执行更新 library(installr) updateR()执行updateR()之后,会弹出一系列交互式对话框,大致流程是:
- 检查 CRAN 上的最新版本,告诉你当前版本和最新版本分别是多少
- 询问是否要下载最新版安装程序
- 下载完成后自动启动安装向导
- 安装完成后,询问是否要把旧版本的包复制到新版本目录下
- 询问是否要更新包(建议选“是”,但如果你包很多,这一步会比较慢)
- 询问是否要保留旧版本的 R
我的建议是:包复制选“是”,包更新选“否”(先复制过来,之后按需更新),旧版本保留选“是”(万一新版本有问题还能回退)。整个流程走完,R 就更新好了。
注意:
installr在复制包的时候,是把旧版本 library 目录下的文件夹直接拷贝到新版本的 library 目录。如果某个包在旧版本下编译过,复制过来之后可能需要重新编译才能在新版本下正常工作。所以复制完成后,最好运行一下update.packages(checkBuilt = TRUE)来重新编译那些需要更新的包。
3.2 手动更新 R 的备选方案
如果installr因为网络原因或者权限问题跑不起来,也可以手动操作:
- 去 CRAN 官网下载 Windows 版的 R 安装程序(.exe 文件)
- 双击运行,安装路径选择一个新目录(比如
C:\Program Files\R\R-4.4.0),不要覆盖旧版本 - 安装完成后,打开新版本的 R,手动安装你需要的包
手动方式的好处是可控性强,坏处是包迁移得自己来。你可以用之前保存的my_packages.csv文件批量安装:
# 读取包列表 pkg_list <- read.csv("my_packages.csv")$x # 批量安装(跳过已安装的) new_pkgs <- pkg_list[!(pkg_list %in% installed.packages()[, "Package"])] install.packages(new_pkgs)3.3 更新 RStudio
RStudio 的更新在 Windows 上非常简单。打开 RStudio,点击菜单栏 Help > Check for Updates。如果有新版本,它会提示你下载。下载完成后关闭 RStudio,运行安装程序,一路下一步就行。RStudio 的安装程序会自动覆盖旧版本,你的配置和项目文件都不会受影响。
如果你习惯手动下载,去 Posit 官网的 RStudio 下载页面,选择对应的 Windows 版本即可。注意区分 “RStudio Desktop” 和 “RStudio Server”,个人电脑上用的是 Desktop 版。
4. macOS 平台更新实操
4.1 更新 R:pkg 安装包直接覆盖
macOS 上更新 R 最直接的方式是去 CRAN 下载最新的.pkg安装包。根据你的芯片类型选择对应版本:Intel 芯片选 x86_64 版本,Apple Silicon(M1/M2/M3)选 arm64 版本。下载后双击安装,它会自动覆盖旧版本。
覆盖安装的好处是,R 的框架目录(/Library/Frameworks/R.framework/)会被更新,但你的个人库目录(~/Library/R/)不受影响。不过要注意,R 的大版本更新(比如 4.3 到 4.4)会改变个人库的路径,因为路径里包含版本号。比如:
- R 4.3 的包路径:
~/Library/R/4.3/library/ - R 4.4 的包路径:
~/Library/R/4.4/library/
所以更新完 R 之后,之前装的包在新版本里是找不到的。解决办法是把旧版本的包目录复制到新版本目录下:
# 在终端中执行 cp -R ~/Library/R/4.3/library/* ~/Library/R/4.4/library/复制完成后,同样建议运行update.packages(checkBuilt = TRUE)重新编译那些需要更新的包。
4.2 用 Homebrew 管理 R 版本
如果你用 Homebrew 管理 macOS 上的软件,更新 R 就是一条命令的事:
brew update brew upgrade rHomebrew 会自动处理版本切换和路径更新。但 Homebrew 安装的 R 和 CRAN 官方 pkg 安装的 R 在路径上有些差异,包库的位置也不一样。如果你之前用的是 CRAN 版本,切换到 Homebrew 版本后需要重新配置包路径,或者干脆统一用一种方式安装,避免混乱。
4.3 更新 RStudio
macOS 上更新 RStudio 有两种方式。一种是打开 RStudio,Help > Check for Updates,它会引导你下载最新的.dmg文件。另一种是直接去 Posit 官网下载.dmg,打开后将 RStudio 图标拖入 Applications 文件夹,系统会提示是否替换旧版本,选择替换即可。
macOS 上 RStudio 的配置文件存在~/.config/rstudio/和~/Library/Application Support/RStudio/两个位置。更新时这些配置会保留,但如果你遇到更新后设置丢失的情况,可以从备份中恢复。
5. Linux 平台更新实操
5.1 Ubuntu/Debian 系:通过 CRAN 源更新
Linux 上更新 R 最规范的方式是配置 CRAN 的 apt 源。以 Ubuntu 22.04 为例:
# 添加 CRAN 的 GPG 密钥 sudo apt install --no-install-recommends software-properties-common dirmngr wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc # 添加 CRAN 源 sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/" # 更新并升级 R sudo apt update sudo apt install r-base r-base-dev这样安装的 R 会随着apt upgrade自动更新。包库路径通常是/usr/local/lib/R/site-library/和/usr/lib/R/site-library/,大版本更新时这些路径不变,所以包不需要迁移。但如果你是用install.packages()安装到个人库(~/R/x86_64-pc-linux-gnu-library/4.3/),那大版本更新后还是需要复制或重装。
5.2 从源码编译安装最新版
有时候 CRAN 的 apt 源更新不够及时,或者你需要某个特定版本,可以从源码编译:
# 下载源码 wget https://cran.r-project.org/src/base/R-4/R-4.4.0.tar.gz # 解压 tar -xzf R-4.4.0.tar.gz cd R-4.4.0 # 配置、编译、安装 ./configure --enable-R-shlib --with-blas --with-lapack make -j$(nproc) sudo make install编译安装的好处是你可以自定义编译选项,比如开启多线程 BLAS、指定安装路径等。坏处是每次更新都要重新编译,比较耗时。而且编译过程中如果缺少系统依赖(比如libreadline-dev、libcurl4-openssl-dev),会报错中断,需要提前装好。
5.3 更新 RStudio
Linux 上 RStudio 的更新取决于你当初是怎么安装的。如果是用.deb包安装的,去 Posit 官网下载最新的.deb,然后:
sudo dpkg -i rstudio-2024.04.0-735-amd64.deb如果是用.rpm包(Fedora/RHEL/CentOS),下载对应的.rpm文件后:
sudo rpm -Uvh rstudio-2024.04.0-735-x86_64.rpmLinux 上 RStudio 的配置文件在~/.config/rstudio/和~/.local/share/rstudio/,更新时会保留。
6. 包迁移的进阶方案:renv 与 pak
6.1 用 renv 锁定项目依赖
前面讲的包迁移方法都是“全局级别”的,也就是把你所有装的包都复制过去。但实际工作中,不同项目依赖的包版本可能不一样,全局复制容易造成版本冲突。renv这个包就是为解决这个问题设计的。
# 在项目目录中初始化 renv install.packages("renv") renv::init() # 这会在项目目录下创建一个 renv/ 文件夹和一个 renv.lock 文件 # renv.lock 记录了当前项目所有包的精确版本更新 R 之后,在新版本中打开这个项目,运行:
renv::restore()renv会根据renv.lock文件自动安装所有依赖包,而且版本完全一致。这样你就不用担心更新 R 之后项目跑不起来了。我现在的习惯是每个重要项目都配一个renv.lock,换电脑、换 R 版本都能一键恢复环境。
6.2 用 pak 加速包安装
pak是一个相对较新的包管理工具,最大的优势是安装速度快,而且能自动处理系统依赖。更新 R 之后,如果你需要重装大量包,用pak会比install.packages()快很多:
# 安装 pak install.packages("pak") # 批量安装包 pak::pkg_install(c("tidyverse", "data.table", "ggplot2", "sf"))pak支持并行下载和安装,而且会缓存已经下载过的包,第二次安装同样的包时几乎瞬间完成。对于经常需要重装环境的人来说,这个工具能省不少时间。
7. 常见问题与排查技巧
7.1 更新后包加载报错怎么办
最常见的报错是 “there is no package called ‘xxx’”,这说明包没有迁移过来。解决办法就是重新安装:
install.packages("xxx")如果报错是 “package ‘xxx’ was built before R 4.4.0: please re-install it”,说明包虽然复制过来了,但是用旧版本 R 编译的,需要重新编译:
update.packages(checkBuilt = TRUE, ask = FALSE)如果某个包死活装不上,先检查系统依赖是否齐全。比如sf包在 Linux 上需要libgdal-dev、libgeos-dev、libproj-dev,在 macOS 上需要gdal、geos、proj。这些系统依赖不装好,R 包编译必然失败。
7.2 RStudio 更新后无法启动
这种情况通常是因为配置文件损坏或者版本不兼容。可以尝试重命名配置目录,让 RStudio 以全新状态启动:
# Linux/macOS mv ~/.config/rstudio ~/.config/rstudio_backup# Windows (PowerShell) Rename-Item "$env:APPDATA\RStudio" "RStudio_backup"如果重命名后能正常启动,说明是配置问题,可以从备份中逐步恢复需要的设置。如果还是不行,可能是安装文件损坏,卸载后重新下载安装。
7.3 更新 R 后中文乱码
Windows 上比较常见。R 4.2 之后默认使用 UTF-8 编码,但如果你之前的脚本是用 GBK 保存的,更新后打开可能会乱码。解决办法是用 RStudio 的 “Reopen with Encoding” 功能,选择 GBK 重新打开,然后另存为 UTF-8。
另外,Windows 上绘图时中文字体也可能出问题。可以在脚本开头设置:
windowsFonts(A = windowsFont("Microsoft YaHei")) par(family = "A")macOS 上一般不会有这个问题,因为系统默认就是 UTF-8。
7.4 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 包加载报错 “no package called” | 包未迁移 | 重新安装或从旧库复制 |
| 包加载报错 “built before R x.x.x” | 包需重新编译 | update.packages(checkBuilt=TRUE) |
| RStudio 启动崩溃 | 配置损坏 | 重命名配置目录后重启 |
| 中文乱码 | 编码不一致 | 用 GBK 重新打开后另存为 UTF-8 |
| 包安装失败 | 系统依赖缺失 | 安装对应的系统库(gdal、geos 等) |
| 更新后找不到旧包 | 库路径变化 | 检查.libPaths()输出 |
8. 我个人的更新节奏与经验体会
说实话,我不建议每次 R 出新版本就立刻更新。大版本刚发布的前几周,很多第三方包还没跟上,尤其是 Bioconductor 上的生信包,通常要等一两个月才会适配新版本。如果你正在做重要分析,贸然更新可能导致环境崩掉,项目跑不起来。
我的做法是:等新版本发布后观察一个月左右,确认常用包都适配了再更新。更新之前一定先跑一遍renv::snapshot()把当前环境锁住,万一新版本有问题,随时可以回退。RStudio 的更新可以积极一些,因为它主要是 IDE 层面的改进,不涉及底层计算环境,更新风险小很多。
还有一点,如果你在团队里工作,更新 R 版本之前最好跟同事同步一下。大家用的版本不一致,共享脚本和 Rmd 文件时容易出现兼容性问题。我们团队现在的做法是统一用 renv 管理项目环境,每个人本地的 R 版本可以不同,但项目依赖的包版本完全一致,这样既保证了可复现性,又不会互相干扰。