02配置 R 启动文件与默认选项

区分 Rprofile.site、.Rprofile 与 .Renviron,安全配置包库、CRAN 镜像、交互选项和个人辅助函数。

2026-08-10
RRprofileRenvironStartupConfiguration
本章目录 · 12

R 每次启动时都可以读取环境文件和 profile 文件。环境文件保存 NAME=value 形式的环境变量,profile 文件则执行普通 R 代码。把包库、镜像和辅助函数放到合适的文件中,可以减少重复设置;放错位置则可能让交互会话、脚本和项目得到不同结果。

Rprofile.site 是整套 R 安装的站点配置,不是每位用户都需要修改的个人配置。个人电脑上,多数偏好放在用户 .Rprofile.Renviron 更容易维护;升级 R 时,它们也不会随着旧安装目录一起被替换。

四个文件的名称和职责

文件名的大小写、开头的点和 .site 后缀都有意义,文件本身没有 .R.txt 扩展名。

文件 内容格式 默认作用范围 适合保存
Renviron.site NAME=value 当前 R 安装的所有用户 站点级环境变量
.Renviron NAME=value 当前用户或当前项目 包库路径、API endpoint、令牌等环境变量
Rprofile.site R 代码 当前 R 安装的所有用户 统一镜像、站点 library、公共启动行为
.Rprofile R 代码 当前用户或当前项目 个人选项、交互辅助函数、项目启动代码

在 Windows 中,站点文件通常位于:

<R_HOME>/etc/Renviron.site
<R_HOME>/etc/Rprofile.site

不要把 Rprofile.site 写成 .Rprofile.site,也不要让文本编辑器偷偷保存为 Rprofile.site.txt。在 R 中查看当前安装的 etc 目录:

R.home("etc")

用户文件通常位于 home directory:

path.expand("~/.Renviron")
path.expand("~/.Rprofile")

项目根目录也可以放 .Renviron.Rprofile。R 会先找当前目录,再找用户 home directory,并且只读取找到的第一份用户文件。因此,项目 .Rprofile 存在时,用户 ~/.Rprofile 不会再自动读取;需要共享逻辑时应显式组织,而不能假设两份文件会自动合并。

R 的启动顺序

一次普通启动大致按以下顺序进行:

Renviron.site

项目或用户 .Renviron

Rprofile.site

项目或用户 .Rprofile

.RData(如果允许恢复)

.First()(如果定义)

环境文件先读取,所以其中的变量可以影响后面的 library 初始化和 R 代码。站点 profile 先于用户 profile,因此用户 .Rprofile 可以覆盖站点设置。

下面这些环境变量可以改变默认文件位置:

Sys.getenv(c(
  "R_ENVIRON",
  "R_ENVIRON_USER",
  "R_PROFILE",
  "R_PROFILE_USER"
))

结果为空表示没有显式改路径,R 会继续使用默认搜索规则。

启动文件出错、需要判断问题是否来自配置时,可以从终端运行:

R --vanilla

还可以分别排除站点或用户 profile:

R --no-site-file
R --no-init-file

不再需要设置 stringsAsFactors

旧的 Rprofile.site 模板经常包含:

options(stringsAsFactors = FALSE)

从 R 4.0.0 开始,data.frame() 和模型读取数据时已经默认不再把字符串自动转换为 factor。对当前 R 版本再次设置通常没有效果,可以删除。分析确实需要 factor 时,应在读取或整理数据时显式转换:

dat$group <- factor(dat$group, levels = c("control", "treated"))

显式转换同时记录了 levels 和顺序,比依赖整个会话的历史默认值更清楚。

help_type 是交互偏好

希望帮助页面在浏览器或 RStudio Help pane 中显示时,可以设置:

options(help_type = "html")

这项设置适合用户 .Rprofile,没有必要作为所有用户的站点策略。服务器、容器或无图形界面的会话可能更适合文本帮助;脚本本身也不应依赖帮助页面的显示方式。

包库优先使用 R_LIBS_USER

直接在站点 profile 中写固定版本路径:

.libPaths("D:/R/library/4.5.1")

存在三个问题:升级补丁版本后路径会过期;换一台电脑后盘符可能不存在;路径在启动时尚未创建时,.libPaths() 不会保留它。

Windows 版 R 已经提供按 R 主次版本区分的默认用户 library。先检查默认值,通常无需自行设置:

Sys.getenv("R_LIBS_USER")
.libPaths()

确实需要把个人包库放到其他磁盘时,在用户 .Renviron 中写:

R_LIBS_USER=D:/R/library/%v

%v 会在启动时展开为不含 patch level 的 R 版本,例如 4.5。这样 R 4.5.1 与 R 4.5.2 可以共用兼容的 4.5 library,而下一次升级到 4.6 时会使用新的目录。目标目录必须预先存在。

共享电脑需要真正的站点 library 时,应由管理员设置 R_LIBS_SITE,或者在 Rprofile.site 中设置 .Library.site 后重新调用 .libPaths(.libPaths())。个人包库不应放在需要管理员权限的 R 安装目录中。

包库、已加载包和 repository 的区别见 R 会话、工作区与包库

设置 CRAN repository 时保留其他来源

设置 CRAN 时不要无意中删除 repos 中的其他名称。可以先读取原选项,只替换 CRAN

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

local() 让临时变量 repos 不会留在 global environment。个人电脑可以把这段放在 ~/.Rprofile;实验室或教学机要求所有用户使用同一来源时,管理员才把它放进 Rprofile.site

Bioconductor 默认使用其官方 repository,不需要为了使用 Bioconductor 就重复设置:

options(BioC_mirror = "https://bioconductor.org/")

只有确实使用其他 Bioconductor mirror 时才需要 BioC_mirror。安装 Bioconductor 包应继续通过 BiocManager::install(),由 BiocManager 根据 R 与 Bioconductor 版本组合 repository。

只在交互会话加载个人辅助函数

个人快捷函数如果只用于 Console,可以限制在交互会话中加载:

if (interactive()) {
  helper_file <- path.expand("~/.R/helpers.R")

  if (file.exists(helper_file)) {
    sys.source(helper_file, envir = .GlobalEnv)
  }
}

使用 home-relative path,避免把 R 版本号、用户名或盘符写死在配置中。file.exists() 可以让辅助文件暂时缺失时仍然正常启动。

这类自动加载只适合个人交互快捷方式。项目运行所需的函数应保存在项目代码中并显式 source(),所需 package 也应在脚本中显式调用;否则脚本可能只在配置过的电脑上成功。

欢迎消息同样应限制在交互会话:

if (interactive()) {
  message("R ", getRversion(), " · ", length(.libPaths()), " libraries")
}

不要在启动文件中弹出菜单、等待输入或执行耗时网络请求。后台任务、R Markdown render 和 IDE 子进程也可能读取这些文件,启动配置越安静、越快速越可靠。

不适合放进启动文件的内容

  • setwd():会改变所有脚本的路径语义,应由项目或调用入口决定;
  • library(tidyverse):自动 attach package 会隐藏脚本的真实依赖,并可能制造函数名冲突;
  • install.packages():启动不应修改 library 或依赖网络;
  • set.seed():全局 seed 会暗中改变每个分析的随机状态,应在使用随机数的任务旁明确设置;
  • 访问令牌:不能写进可能提交到 Git 的 .Rprofile,应放在未跟踪的 .Renviron 或凭据系统中;
  • 绝对的版本安装路径:升级 R 后容易失效,应使用 R.home()path.expand("~") 或版本占位符构造。
一套完整的参考配置

下面是一套相互配合的 Windows 配置。站点 profile 只承担真正共享的默认值,环境变量负责版本化包库,用户 profile 负责个人交互行为。

Rprofile.site

共享机器由管理员维护;个人机器也可以把同一段放到 ~/.Rprofile,避免升级 R 时重新复制:

local({
  repos <- getOption("repos")
  repos["CRAN"] <- "https://cloud.r-project.org"

  options(repos = repos)
})

~/.Renviron

只有需要自定义包库时才添加这一行,并提前创建对应版本目录:

R_LIBS_USER=D:/R/library/%v

项目 .Renviron 和包含令牌的用户 .Renviron 不应提交到公开仓库。

~/.Rprofile

local({
  options(
    help_type = "html",
    width = 100
  )
})

if (interactive()) {
  helper_file <- path.expand("~/.R/helpers.R")

  if (file.exists(helper_file)) {
    sys.source(helper_file, envir = .GlobalEnv)
  }

  message("R ", getRversion(), " ready")
}

如果 CRAN 没有在 Rprofile.site 中统一设置,就把前面的 repository block 合并到这里的 local() 中。不要在 site 和 user 两层重复维护同一个选项。

验证和排错

修改后完全关闭并重新启动 R,再检查最终状态:

getOption("repos")
getOption("help_type")
Sys.getenv("R_LIBS_USER")
.libPaths()

profile 是 R 代码,可以在启用前检查语法:

parse(file = path.expand("~/.Rprofile"))
parse(file = file.path(R.home("etc"), "Rprofile.site"))

如果正常启动失败:

  1. R --vanilla 确认问题是否来自启动文件;
  2. 分别使用 --no-site-file--no-init-file 判断是 site 还是 user profile;
  3. 检查当前目录是否存在优先于 home 文件的项目 .Rprofile.Renviron
  4. 检查自定义 library directory 是否已经存在;
  5. 把启动文件中的代码逐段放回,而不是一次恢复整份旧配置。

R 的官方 Startup 文档说明了完整的文件搜索顺序;.libPaths() 文档列出了 R_LIBS_USERR_LIBS_SITE%v 等版本占位符的行为。