R 项目与工作区管理
创建 RStudio 项目,并管理 .RData、.Rhistory 和 .Renviron
R 项目与工作区管理 是 CoddyKit 上的免费 R Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
R 工作区:.RData 和 .Rhistory
默认情况下,退出 R 时,R 会询问您是否要将工作区(内存中的所有对象)保存到工作目录下名为 .RData 的隐藏文件中。您的命令历史记录会保存到 .Rhistory。下次启动会话时,这些文件会自动加载。
这种便利也可能成为可复现性的陷阱。
# .RData: binary snapshot of all objects in the global environment
# .Rhistory: text file of every command you typed
# See what would be saved right now:
cat('Objects that would be saved:', length(ls()), '\n')
cat('Their names:', paste(ls(), collapse = ', '))
# Workspace saving is controlled by:
# Tools -> Global Options -> General -> Save workspace (NEVER recommended)
# Or at startup: R --no-save --no-restore为什么要避免自动保存 .RData?
依赖 .RData 意味着您无法从头开始复现结果。对象会在各个会话之间悄无声息地累积,旧变量会遮蔽新变量,协作者也无法复现您的环境。解决方法是:永远不要保存工作区——始终通过运行脚本重新创建它。
# The recommended R startup setting (in RStudio):
# Tools -> Global Options -> General
# Restore .RData at startup: UNCHECKED
# Save workspace on exit: NEVER
# This forces you to write scripts that are fully self-contained.
# A fresh session that runs cleanly = reproducible analysis.
# Equivalent command-line flags:
# R --no-save --no-restore
cat('Always start fresh!')rm()——清理工作区
rm(list = ls()) 是从全局环境中删除所有对象的标准方法,可以在不重启 R 的情况下模拟全新会话。它通常放在脚本开头,以确保每次运行时环境都是干净的。
# Create some objects
a <- 1
b <- 'hello'
df <- data.frame(x = 1:3)
cat('Before rm:', length(ls()), 'objects\n')
# Remove specific objects
rm(a, b)
cat('After rm(a,b):', length(ls()), 'objects\n')
# Remove ALL objects in global environment
rm(list = ls())
cat('After rm(list=ls()):', length(ls()), 'objects')options()——全局会话设置
options() 控制许多适用于整个 R 会话的行为。最常设置的两个选项是 scipen(科学计数法惩罚)和 digits(打印的有效数字位数)。请在脚本开头设置它们,以确保输出一致。
# Default behavior:
cat(0.000123456, '\n') # may show 1.23456e-04
# Suppress scientific notation (positive scipen = prefer fixed)
options(scipen = 999)
cat(0.000123456, '\n') # now shows 0.000123456
# Control printed digits
options(digits = 4)
cat(pi, '\n') # 3.142
# Check current options:
cat('scipen:', getOption('scipen'), '\n')
cat('digits:', getOption('digits')).Renviron——环境变量
.Renviron 文件存储 R 启动时加载的环境变量。它适合保存 API 密钥、数据库密码和文件系统路径等机密信息和配置值,从而避免将这些内容写入源代码。
# .Renviron file (in ~ or project root):
# DATABASE_URL=postgres://user:pass@host/db
# OPENAI_API_KEY=sk-abc123
# DATA_ROOT=/data/shared
# Read in R:
db_url <- Sys.getenv('DATABASE_URL')
api_key <- Sys.getenv('OPENAI_API_KEY', unset = 'KEY_NOT_SET')
cat('DB URL set:', nchar(db_url) > 0, '\n')
cat('API key:', api_key)
# To edit .Renviron:
# usethis::edit_r_environ() <- if usethis is installed
# file.edit('~/.Renviron') <- base RsaveRDS()——保存单个对象
saveRDS() 会将单个 R 对象序列化到 .rds 文件中。这是缓存高成本计算结果的首选方法,因为该文件只存储一个对象,您可以精确控制要保存和加载的内容。
# Create an object to save
result_list <- list(
model = 'linear_regression',
r2 = 0.87,
rmse = 12.4,
created = Sys.time()
)
# Save to disk
tmp_rds <- tempfile(fileext = '.rds')
saveRDS(result_list, file = tmp_rds)
cat('Saved to:', tmp_rds, '\n')
# Load it back (even in a fresh session)
loaded <- readRDS(tmp_rds)
cat('R-squared:', loaded$r2)readRDS()——恢复单个对象
readRDS() 会将 .rds 文件反序列化,恢复为 R 对象。与 load() 不同,您必须将返回值赋给一个名称,因此可以在代码的不同位置用不同名称加载同一个文件。
# Suppose model_results.rds was saved earlier
tmp <- tempfile(fileext = '.rds')
saveRDS(list(coef = c(1.2, 3.4), n = 100), tmp)
# Load with a meaningful name:
model_output <- readRDS(tmp)
cat('Coefficients:', model_output$coef, '\n')
cat('Sample size:', model_output$n, '\n')
# Key advantage over load():
# With load(), the name is baked into the file.
# With readRDS(), YOU choose the name on load.
cat('readRDS gives you naming control')save() 和 load()——多个对象
save() 会将一个或多个具有名称的对象序列化到 .RData 文件中。load() 会恢复这些对象,但原始名称也会自动恢复,可能在不知不觉中覆盖现有对象。请谨慎使用。
# Save multiple objects at once
scores <- c(85, 92, 78)
labels <- c('Alice', 'Bob', 'Carol')
tmp_rdata <- tempfile(fileext = '.RData')
save(scores, labels, file = tmp_rdata)
cat('Saved to:', tmp_rdata, '\n')
# Remove originals to simulate a new session
rm(scores, labels)
cat('Removed. Objects now:', length(ls()), '\n')
# Load restores original names automatically
load(tmp_rdata)
cat('Restored scores:', scores)saveRDS 与 save——如何选择
当您希望完全控制加载时的命名时,请对单个对象使用 saveRDS()——这非常适合保存模型输出、处理后的数据集和缓存结果。只有在需要为特定的协作者工作流程打包多个具有名称的对象时,才使用 save()。
# saveRDS: one object, you name it on load
# saveRDS(my_model, 'outputs/model_v2.rds')
# m <- readRDS('outputs/model_v2.rds') <- your name choice
# save: multiple objects, names fixed in the file
# save(model, validation_df, file = 'outputs/session.RData')
# load('outputs/session.RData') <- restores 'model' and 'validation_df'
# Practical rule:
# saveRDS for caching single results
# save for snapshots shared between collaborators
cat('saveRDS is usually the better choice')检查和恢复 options()
会话期间设置的选项只在该会话中有效。为确保脚本自包含,请在开头设置所需选项,并可以选择在脚本结束时使用 on.exit() 恢复旧值。
# Capture current options before changing
old_options <- options(scipen = 999, digits = 3)
# Use on.exit to restore them no matter what
on.exit(options(old_options), add = TRUE)
# Now do your work
cat(pi, '\n') # 3.14
cat(1234567.89, '\n') # 1234568 (no sci notation)
# When function or script exits, options are restored automatically
cat('Options will restore on exit')使用 RStudio 项目管理工作区
RStudio 项目(.Rproj 文件)会自动将工作目录设置为项目根目录,为每个项目分别保存 .Rhistory,并隔离会话选项。这是管理自包含 R 项目的标准方式。
# When you open a .Rproj file, RStudio automatically:
# 1. Sets working directory to the project root
# 2. Loads the project-specific .Rhistory
# 3. Optionally restores project .RData
# Best practice for new projects:
# File -> New Project -> New Directory -> New Project
# Your project structure then looks like:
# my_project/
# my_project.Rproj
# .Rprofile (project-level options)
# .Renviron (project-level env vars)
# R/ (scripts)
# data/ (raw data)
# output/ (results)
cat('RStudio Projects = clean workspaces')快速检查
您想将名为 clean_data 的单个 R 数据框保存到磁盘,以便在另一个脚本中使用您选择的任意变量名重新加载。应该使用哪个函数?
工作区管理——要点总结
管理良好的 R 工作区是可复现分析的基础:
.RData/.Rhistory——自动保存的工作区文件(请禁用自动保存!)rm(list = ls())——清除所有对象,获得干净的初始环境options(scipen = 999, digits = 4)——控制数字格式.Renviron——将 API 密钥和路径作为环境变量存储saveRDS(obj, 'file.rds')——缓存单个对象readRDS('file.rds')——使用您自己的名称恢复对象save(a, b, file = 'session.RData')——打包多个对象load('session.RData')——恢复所有打包的对象- 使用 RStudio 项目自动管理工作目录
# Typical script header for clean, reproducible analysis:
rm(list = ls()) # clean workspace
options(scipen = 999, digits = 4) # formatting
# Load secrets from .Renviron:
db_url <- Sys.getenv('DATABASE_URL')
# Load cached data if available:
cache_file <- file.path('cache', 'processed_data.rds')
if (file.exists(cache_file)) {
df <- readRDS(cache_file)
cat('Loaded from cache\n')
} else {
cat('Cache not found, run data_prep.R first\n')
}
cat('Workspace ready')用 AI 导师学习 R — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 43
- 课程
- 159
常见问题解答
「R 项目与工作区管理」课时是免费的吗?
是的 — 「R 项目与工作区管理」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「R 项目与工作区管理」这节课中我会学到什么?
创建 RStudio 项目,并管理 .RData、.Rhistory 和 .Renviron 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「R 项目与工作区管理」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 source() 加载脚本
- 注释、风格与可读性
- 工作目录与文件路径
- R 项目与工作区管理