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"))
如果正常启动失败:
- 用
R --vanilla确认问题是否来自启动文件; - 分别使用
--no-site-file和--no-init-file判断是 site 还是 user profile; - 检查当前目录是否存在优先于 home 文件的项目
.Rprofile或.Renviron; - 检查自定义 library directory 是否已经存在;
- 把启动文件中的代码逐段放回,而不是一次恢复整份旧配置。
R 的官方 Startup 文档说明了完整的文件搜索顺序;.libPaths() 文档列出了 R_LIBS_USER、R_LIBS_SITE 与 %v 等版本占位符的行为。