章节概述

本章从 RStudio 的基本操作开始,依次练习创建 R Script、运行代码和建立 R Project,并把数据、脚本、图片与报告整理到清楚的项目目录中。随后完成 tidyverse 的安装与加载,认识工作目录和相对路径在文件管理中的作用。

后半章介绍 R Markdown:把说明文字与 R 代码写进 .Rmd 文件,通过 Knit 运行代码,并把文字、代码与结果整合为 HTML。完成本章后,应能整理本地项目,编写基础报告,并从新的 R 会话重新生成网页。

本章学习内容

学习导航

本章学习内容

本章依次介绍项目管理、R 包与 R Markdown,最后通过练习完成一份可重新生成的网页报告。

阅读提示:通过返回主页或主页按钮,可回到本章学习导航。

1.0 RStudio 与项目

1.0 RStudio 与项目

1.1 初始界面

首次启动且尚未打开脚本或文档时,RStudio 通常显示三个窗格。下方的“RStudio 初始三窗格界面”标出了各区域;窗格位置可以在设置中调整,但其主要功能基本不变:

  • 左侧:控制台 (Console) 图中红色边框

    控制台是 RStudio 与当前 R 进程交互的窗口。在提示符 > 后输入代码并按 Enter,当前 R 进程会执行代码,结果或报错信息随即显示在下方。

  • 右上:环境面板 (Environment) 图中蓝色边框

    Environment 面板主要列出当前全局环境 (Global Environment) 中的对象,例如数据框、数值向量和自行创建的函数。它适合检查对象是否已经生成及其基本结构,但不会列出扩展包命名空间中的全部函数。

  • 右下:多功能面板 (Files / Plots / Packages / Help) 图中绿色边框

    该面板通过多个标签页组织辅助工具,包括浏览文件 (Files)、查看图形 (Plots)、管理扩展包 (Packages) 和查阅帮助文档 (Help)。部分版本还会显示 Viewer 等标签页。

RStudio 初始三窗格界面:Console、Environment 与多功能面板

RStudio 初始三窗格界面:Console、Environment 与多功能面板


1.2 源代码编辑器

“RStudio 初始三窗格界面”中尚未打开脚本,因此源代码编辑器 (Source Editor) 没有显示。控制台适合快速试算和排错,但控制台历史不应作为正式的分析记录。将代码写入脚本,才能持续保存、修改和重新运行分析步骤。


1.2.1 创建 R Script

点击 RStudio 左上角的 New File 图标,在下拉菜单中选择 R Script,即可新建脚本文件。

新建脚本后,界面通常变为四窗格布局。下方的“打开 R Script 后的四窗格工作区”标出了新增区域:

  • 左上:源代码编辑器 (Source) 图中黄色边框

    Source 用于编写和管理代码。脚本 (Script) 可以保存到磁盘、反复修改并按需要运行,是记录分析过程和复现结果的基础。

打开 R Script 后的四窗格工作区:黄色边框标示 Source 编辑器

打开 R Script 后的四窗格工作区:黄色边框标示 Source 编辑器

类比理解:把 RStudio 当作一间厨房

可以用厨房的工作流程辅助记忆四个窗格的分工:

  • Source(编辑器):记录“菜谱”(保存分析步骤)
  • Console(控制台):按步骤“下锅”(执行和测试代码)
  • Environment(环境):查看工作台上的“食材”(当前全局环境中的对象)
  • Files / Plots / Packages / Help(多功能面板):相当于工具柜与出菜窗口(管理文件、扩展包、帮助和图形输出)
RStudio 四个窗格的厨房工作流类比(右下图以 Plots 标签页为例)

RStudio 四个窗格的厨房工作流类比(右下图以 Plots 标签页为例)

类比的边界:这幅图用于帮助识别界面分工。Environment 中的对象属于当前 R 会话,关闭会话后可能消失。需要长期保留的分析应写入脚本,并保存数据文件和必要的运行说明。


1.2.2 编写脚本

在默认名为 Untitled1 的空白脚本中输入以下代码。文件保存前,名称旁通常会显示星号,表示存在尚未保存的修改。

示例同时展示了对象赋值、算术运算、向量和函数调用。行尾的注释 (comments) 用于说明代码含义,不会参与计算。

# 1. 输出字符
print("Hello World")  # 在控制台显示字符串

# 2. 基础算术运算
1 + 1                 # 加法运算
4 - 1                 # 减法运算
2 * 2                 # 乘法运算
5 / 2                 # 除法运算

# 3. 创建对象并参与运算
x <- 10               # 把数值 10 赋给对象 x
x^2                   # 计算 x 的平方
y <- 20               # 把数值 20 赋给对象 y
x / y                 # 计算对象 x 除以 y 的商

# 4. 创建向量并调用函数
z <- c(x, y, 30)      # 用 c() 组合三个数值
mean(z)               # 计算算术平均值

注释符 (#) 与代码文档化

在 R 代码中,位于引号外的 # 表示注释开始;从 # 到该行末尾的内容不会执行。若 # 出现在字符串内部,例如 print("A # B"),它仍是字符串的一部分。

  • 入门示例:本节的行尾注释用于帮助识别语句功能。
  • 实际项目:注释应优先解释“为什么这样处理”,例如数据来源、变量单位、筛选依据和参数选择。无需逐行复述代码已经清楚表达的动作。

实践建议:注释应与代码同步更新。已经失效的注释比没有注释更容易造成误解。

依次运行这段代码后,Environment 面板中应出现 x、y 和 z,运行最后一行时,Console 应显示 [1] 20。


1.2.3 运行代码

Source 中的代码保存后仍只是脚本文本,只有发送到当前 R 会话后才会执行。入门阶段主要使用以下两种方式。

方式一 运行当前行 入门阶段推荐

逐行运行便于及时查看结果和定位报错。没有选中代码时,RStudio 会运行光标所在的当前行。

  • 光标定位:
    将光标置于目标行中,无需先选中整行。
  • 执行操作:
    • 鼠标点击:
      点击脚本面板右上角的 Run 按钮。
    • 快捷键:
      • Windows 操作系统:Ctrl + Enter
      • macOS 操作系统:Cmd ⌘ + Enter

操作提示:在默认设置下,运行当前行后光标通常移动到下一行,便于继续执行。

方式二 运行选中的代码

需要连续运行几行代码,或一条语句跨越多行时,应先选中完整代码段。RStudio 只会运行当前选中的内容。

  1. 选定代码:
    使用鼠标或键盘选中目标代码段。
  2. 执行操作:
    点击 Run,或使用与方式一相同的快捷键:Windows 为 Ctrl + Enter,macOS 为 Cmd ⌘ + Enter。

两种方式的区别:没有选中代码时运行光标所在行;选中代码后运行选中的部分。按钮和快捷键相同。


1.3 R Project

重要

开始正式分析前,应先建立清楚、稳定的项目目录。

数据分析通常涉及多类文件,例如数据(data/)、代码脚本(scripts/)、输出图表或表格(outputs/)以及说明文档(docs/)。

一种可行的 R Project 目录结构(目录名称可按项目需要调整)

一种可行的 R Project 目录结构(目录名称可按项目需要调整)

如果文件散落在不同位置,代码容易因文件路径 (file path) 变化而失效,输出文件也较难追踪。RStudio 的 R 项目 (R Project) 为每项分析提供稳定的项目入口和工作目录。


1.3.1 工作目录与相对路径

打开 R Project 后,RStudio 会把项目根目录设为当前工作目录 (current working directory)。相对路径会从这个目录开始查找文件。

R Project 管理的是项目入口、工作目录和部分 RStudio 设置,并不会自动固定 R 版本或扩展包版本。完整的可复现分析还需要保存数据、代码、依赖信息和必要的运行说明。

  • 硬编码绝对路径的局限:
    C:/Users/Name/Documents/Analysis/data.csv 依赖特定设备和用户目录。项目移动或交给其他人后,这条路径往往不再存在。
  • 项目相对路径的优势:
    data/survey.csv 表示“从当前项目根目录进入 data 文件夹”。只要项目内部结构不变,整个项目移动后通常仍能运行。

项目内部文件不要硬编码个人绝对路径

绝对路径在语法上并没有错误,但不适合指向项目内部、需要共享的文件。例如读取 survey.csv:

不推荐:写入个人电脑的绝对路径

my_data <- read.csv("C:/Users/张三/Desktop/survey.csv")


这条路径依赖某台 Windows 电脑上的用户名和桌面位置。更换设备、账号或文件位置后,代码就可能读取失败。


推荐:使用项目相对路径
把数据放在项目的 data/ 文件夹中,并从项目根目录写出相对位置:

my_data <- read.csv("data/survey.csv")

当分析确实需要访问项目外部的共享盘或系统资源时,绝对路径可能无法避免。此时应把路径集中写在配置文件或脚本开头,避免散落在多处代码中。


1.3.2 创建新的 R Project

下面建立本章练习使用的 chapter_1 项目。

Step 1 启动向导:点击 RStudio 界面右上角的 Project 立方体图标,并在下拉菜单中选择 New Project…。


Step 2 选择项目类型:在向导中依次选择 New Directory 和 New Project。下方两幅向导截图分别对应这两个选择。

创建 R Project:选择 New Directory

创建 R Project:选择 New Directory

创建 R Project:选择 New Project

创建 R Project:选择 New Project

Step 3 设置名称与位置:填写项目目录名,并选择项目保存位置。

  • 目录名称 (Directory name):
    输入 chapter_1。
  • Create project as subdirectory of:
    点击右侧 Browse 选择用于存放该项目的主文件夹路径。
  • 点击 Create Project。RStudio 会打开新项目,界面右上角显示项目名称 chapter_1。
创建 R Project:设置项目名称与保存位置

创建 R Project:设置项目名称与保存位置

项目命名建议

为减少跨平台协作中的路径问题,课程项目采用以下命名约定:

  • 优先使用英文字符:
    现代 R 与 RStudio 通常可以处理中文路径,但部分旧扩展包、外部命令或跨平台流程仍可能遇到编码问题。课程项目优先使用英文字母、数字、下划线和连字符。
  • 尽量避免空格:
    含空格路径在正确引用时可以使用,但传递给命令行或外部工具时更容易出错。可用下划线 (_) 或连字符 (-) 分隔词语,例如 final_project。
  • 避开系统保留字符:
    不要使用路径分隔符或操作系统保留字符,例如 \, /, :, *, ?, ", <, > 和 |。

1.3.3 打开项目

重要

项目创建后,项目目录中会生成一个 .Rproj 文件。后续应先打开项目,再打开脚本或 R Markdown 文档,以确保相对路径从正确的项目根目录开始解析。

正确打开项目

每次开始分析时,可通过以下两种方式之一打开项目:

  • 途径一:基于文件系统的直接启动 在操作系统的文件管理器中双击 .Rproj 文件。

    注意:直接双击 .R 或 .Rmd 文件只表示打开该文档,并不能保证 RStudio 已切换到对应项目。打开后应检查右上角显示的项目名称。

  • 途径二:基于 RStudio 界面内的项目切换 如果 RStudio 已经启动,可在右上角的 Project 菜单中选择 Open Project…,或从最近项目列表中选择 chapter_1。

打开项目后,可在控制台运行以下代码进行检查:

getwd()      # 查看当前工作目录,应指向 chapter_1 项目根目录
list.files() # 查看项目根目录中的文件

如果右上角显示 chapter_1,且 getwd() 返回该项目文件夹,说明项目已经正确加载。


1.3.4 整理项目文件

R Project 让 R 可以从固定的项目文件夹开始查找文件。为了避免数据、代码和结果混在一起,还需要按用途整理文件。目录结构没有唯一标准;对于课程作业和中小型研究项目,下面这套简单结构通常已经够用。

路径 主要用途 维护建议
data/raw_data/ 保存原始数据 尽量只读保留,不手工修改或覆盖原文件
data/processed_data/ 保存整理后的分析数据 由脚本生成,并能找到对应的原始数据和处理步骤
scripts/ 保存导入、整理、分析和绘图代码 可按运行顺序命名,例如 01_import.R、02_clean.R
images/ 与 outputs/ 保存图形、表格和报告 文件较多时可细分为 figures/、tables/ 等子文件夹
docs/ 保存 README、数据字典和说明 记录数据来源、脚本运行顺序、需要使用的软件和重要说明
temp/ 保存可以重新生成的临时文件 不把临时文件当作最终结果或长期存档

以下习惯有助于减少“文件找不到”“结果来自哪一步不清楚”等常见问题:

  1. 原始数据和整理后的数据分开保存:所有整理步骤都写进脚本,不依赖事后难以说明的手工修改。
  2. 项目里的文件使用相对路径:避免在脚本中反复调用 setwd(),也不要到处填写个人电脑的桌面路径。
  3. 文件名写清楚顺序和用途:例如 00_setup.R、01_import.R、02_clean.R 和 03_analysis.R。避免使用 final_v2_new_latest.R 这类难以判断先后关系的名称。
  4. 数据和分析结果分开保存:结果由代码写入指定文件夹,不覆盖原始数据;需要保留多个批次时,可在文件名中加入 YYYY-MM-DD 日期。
  5. 写一份简短的 README:说明项目做什么、数据来自哪里、脚本按什么顺序运行,以及结果保存在何处。
  6. 重启 R 后重新运行一次:从脚本第一行开始运行,检查是否遗漏了没有写进脚本的步骤。

R Project 不能代替备份

R Project 不会自动保存文件的历史版本,也不能恢复误删的内容。重要项目仍需定期备份;需要多人协作或查看修改记录时,可以进一步学习 Git 等版本管理工具。


1.4 本节小结

本节需要记住的五件事

  • R 负责计算,RStudio 提供操作界面:在 RStudio 中可以编写代码、运行代码、查看结果和管理文件;真正执行计算的是 R。
  • 脚本用来保存分析步骤:Source 适合编写和保存代码;Console 适合临时试算,但不能代替已经保存的脚本。
  • Environment 里的内容是临时的:它显示当前 R 会话中已经生成的数据和变量。关闭或重启 R 后,这些内容可能消失,因此重要步骤要写进脚本,数据要保存到文件中。
  • R Project 帮助 R 找到项目里的文件:先打开 .Rproj,再使用 data/...、scripts/... 等路径,项目移动到其他位置后,代码通常仍能找到对应文件。
  • 文件整理清楚,分析才容易重新运行:保留原始数据、保存完整脚本、写一份简单说明,并定期备份项目。

开始分析前的快速检查

  1. RStudio 右上角是否显示正确的项目名称;
  2. getwd() 显示的是否为当前项目文件夹;
  3. 原始数据、脚本和分析结果是否分开放在不同文件夹;
  4. 代码是否使用 data/... 这类项目内路径,而不是个人电脑的完整路径;
  5. 重启 R 后,脚本能否从第一行开始重新运行并得到预期结果。


2.0 R 包管理

2.0 R 包管理

R 的许多分析功能来自扩展包。本节先建立包管理脚本,再完成 tidyverse 的安装与加载。

2.1 包管理脚本

Console 适合临时输入,包加载代码则应保存在脚本中。为便于重复运行,可在项目中建立 scripts/01_packages.R,集中记录所需的包。

按下面三步保存脚本

  1. 在 RStudio 右下角的 Files 面板中点击 New Folder,新建 scripts 文件夹。
  2. 点击左上角 ,选择 R Script。
  3. 立即按 Ctrl + S(macOS 为 Cmd ⌘ + S),进入 scripts 文件夹,将脚本保存为 01_packages.R。

文件名前的 01_ 表示运行顺序。后续若增加数据整理脚本,可继续使用 02_import_data.R、03_clean_data.R 等名称。

为什么放进 scripts 文件夹?

项目根目录保留 .Rproj 和说明文件。分析脚本统一放入 scripts/,数据和结果分别放入 data/ 与 outputs/,以后增加文件时仍能快速找到相应内容。

2.2 R 自带的功能与扩展包

R 包 (package) 把一组相关函数、帮助文档和示例数据整理在一起。学习包管理前,先认识下面三类功能来源。

随 R 提供

基础 R

包括 base、stats、graphics 等基础包,负责常用计算、基础统计和绘图。多数基础功能打开 R 后即可使用。

一同安装

推荐包

例如 MASS、Matrix。它们随标准版 R 一同安装,但通常仍要先用 library() 加载。

按需添加

扩展包

例如 dplyr、ggplot2。它们通常需要先从 CRAN 等仓库安装,再在当前 R 会话中加载。

Base R 像一部刚出厂的 iPhone,RStudio 是这节课使用的操作界面;需要专业功能时,再从“应用商店”安装相应的 R 包。

RStudio
ConsoleScript · Data · Plot
BASE R · CORE SYSTEM
Base R基础计算、统计、绘图与文件操作
R Package Store

不同的包,为不同的分析任务提供专业功能

CRANGitHubBioconductor
FEATURED PACKAGES数千个扩展功能可供选择
dplyr数据变换
GET
ggplot2数据可视化
GET
readr读取数据
GET
tidyr整理数据
GET
broom整理模型结果
GET
tidymodels建模工作流
GET

比喻的边界

CRAN 类似应用仓库,主要检查包是否符合技术规范、能否在不同系统上构建。它不会替使用者判断研究方法是否合适。使用专业包时,仍需阅读文档、相关论文和适用条件。

包通常从哪里获得?

常规来源

CRAN

R 最主要的公共包仓库。课程中常用的稳定版本通常从这里安装:

install.packages("包名")

开发来源

GitHub

部分包会先在 GitHub 发布开发版,也有一些研究工具只在代码仓库提供。安装前应先查看维护状态、说明文档和依赖要求。

进阶了解:使用 remotes 从 GitHub 安装包

过去的教程常用 devtools::install_github(),这条命令现在仍能使用。仅安装 GitHub 包时,可以选用体积更小、功能更集中的 remotes:

# remotes 只需安装一次;请在 Console 中运行
install.packages("remotes")

# 安装 GitHub 上的 statxplorer 开发版
remotes::install_github("houseofcommonslibrary/statxplorer")

statxplorer 可连接英国 DWP 的 Stat-Xplore Open Data API。这个示例还涉及 API key 和外部数据服务,暂列为选学内容。需要获取这类公开数据时,再按官方文档完成配置。


2.3 安装与加载

安装负责把包保存到电脑中;加载负责在当前 R 会话中启用包里的函数。下面两张卡片列出了各自的使用场景。

第一次配置

安装 install.packages()

把包下载到这台电脑的 R 包库中。

install.packages("tidyverse")
在哪里运行
Console
多久运行一次
通常每台电脑一次
何时再运行
重装、更新或更换 R 环境时

每次开始分析

加载 library()

让包中的函数在当前 R 会话中可以直接使用。

library(tidyverse)
在哪里保存
分析脚本开头
多久运行一次
每个新 R 会话一次
何时失效
关闭或重启 R 后

使用频率:通常安装一次;新会话重新加载。

2.3.1 先安装:在 Console 中完成一次性配置

第一次使用 tidyverse 时,在 Console 输入并按 Enter:

install.packages("tidyverse")

install.packages() 接收文本形式的包名,因此包名要放在引号中。现阶段可以把它记作固定写法。

常见错误:安装时漏写引号

下列写法中的 tidyverse 会被 R 当作一个已经存在的对象:

install.packages(tidyverse)

Console 通常会提示 object 'tidyverse' not found。改回 install.packages("tidyverse") 即可。

2.3.2 再加载:把可重复步骤写进脚本

安装完成后,打开刚才保存的 scripts/01_packages.R,写入:

# 每次启动新的 R 会话后运行
library(tidyverse)

# 查看当前安装的 tidyverse 版本
packageVersion("tidyverse")

将光标放在代码所在行,按 Ctrl + Enter(macOS 为 Cmd ⌘ + Enter)逐行运行。

library() 到底要不要加引号?

library(tidyverse) 与 library("tidyverse") 都能运行。本课程统一使用较常见的 library(tidyverse)。安装命令仍应写成 install.packages("tidyverse"),其中的包名需要引号。

选学操作:使用 RStudio 的 Packages 面板

右下角 Packages 面板也能完成部分包管理操作:

  • 点击 Install 可以安装包;
  • 点击 Update 可以更新包;
  • 勾选包名前的复选框可以加载包。

这些按钮最终会调用相应的 R 命令。课程以命令写法为主,便于保存操作记录,也方便在另一台电脑上重新运行。


2.4 tidyverse

tidyverse 汇集了一组常用的数据分析包,涵盖数据读取、整理、转换、文本处理和绘图。各包采用相近的语法和数据格式,前后步骤更容易衔接。

常见处理顺序:读取数据 → 整理数据 → 开展分析 → 绘制图表。后续章节会逐步使用这些工具。

2.4.1 本课程最常用的五个包

下面五个包会在后续章节反复使用。点击卡片可打开官方文档。

查看 CRAN 包参考手册(PDF)

下面链接指向 CRAN 生成的包参考手册。为方便国内访问,链接使用清华大学开源软件镜像站。第一次加载或调用一个新包前,可先看手册开头的包说明,再查与当前任务有关的函数条目;无需从头读到尾。

把包手册提供给 AI Agent

遇到较少见或专业性较强的包时,可先运行 packageVersion("包名") 确认版本,再把相应的 PDF 手册、具体任务和完整报错作为参考材料提供给 AI Agent。生成的代码仍需在 R 中实际运行并核对输出;上传材料前先删除个人路径、账号和未公开数据。

展开查看:tidyverse 2.0.0 的另外四个核心包

library(tidyverse) 会同时加载九个核心包。本节重点介绍了五个,另外四个是:

  • tibble:提供更适合阅读和打印的现代数据框;
  • purrr:帮助重复执行相似操作;
  • forcats:整理分类变量;
  • lubridate:处理日期与时间。

暂时不用背下所有包名和函数。遇到具体任务时,再根据用途查阅帮助文档。

查看 tidyverse 官方包清单

2.4.2 安装一次,随后从脚本加载

电脑中还没有 tidyverse 时,先在 Console 运行:

install.packages("tidyverse")

安装完成后,回到 scripts/01_packages.R,运行加载与版本检查代码:

# 加载本课程常用的数据处理与绘图工具
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# 检查当前安装的 tidyverse 版本
packageVersion("tidyverse")
[1] '2.0.0'

首次加载时,Console 会列出包名和冲突信息。 判断是否报错时,先查看最后几行。

加载信息列出当前启用的核心包和同名函数。Console 最后重新出现 >,且没有以 Error 开头的信息,通常表示加载已经完成。

展开阅读:什么是函数同名提示?

不同包偶尔会使用相同的函数名。例如:

dplyr::filter() masks stats::filter()

这行提示表示:直接输入 filter() 时,R 会优先使用 dplyr 中的版本。

课程中的大多数代码可在 library(tidyverse) 后直接写 filter()。遇到下面两种情况,再加上包名:

  1. 同名函数导致结果与预期不同,需要明确指定来源,例如 dplyr::filter();
  2. 只想调用某个包中的一个函数,不想加载整个包,例如 readr::read_csv()。

出现 “could not find function” 或结果异常时,依次检查函数拼写、包是否已经加载,以及是否存在同名函数。运行 tidyverse_conflicts() 可以查看当前冲突清单。

安装没有成功时,按顺序排查

  1. 确认网络可用,并重新选择一个可访问的 CRAN 镜像;
  2. 若提示包正在使用,重启 R 会话后先安装、再加载;
  3. 若询问是否使用个人包库,通常可以选择 Yes;
  4. 仍无法解决时,保留 Console 中从 Error 开始的完整信息,便于定位原因。

2.5 知识点自测

选择答案后点击“检查答案”,页面会显示对应解析。

01昨天已经安装 tidyverse。今天重启 RStudio 后运行 select(),Console 提示找不到该函数。应先执行哪一步?

02加载 tidyverse 后出现 dplyr::filter() masks stats::filter()。分析需要 stats 包的 filter(),应使用哪条命令?

3.0 R Markdown 工作流

3.0 R Markdown 工作流

“R Markdown provides an authoring framework for data science.”
译文: R Markdown 为数据科学提供了一套写作框架。
— Posit,R Markdown: The Basics

数据分析常同时涉及脚本、图表和报告。若三类文件分开维护,数据或代码更新后,还要重新导出图表并逐一替换报告内容。漏换一张图或复制错一个数字,都会让报告与分析结果不一致。

R Markdown 文件(.Rmd)保存说明文字与 R 代码。完成修改后重新 Knit(编织),即可运行代码,并把文字、代码与结果整合为 HTML、Word 或 PDF 文档。

01
传统写作工具多个文件,依靠手工同步
analysis.RR SCRIPT
代码与报告分开保存
figure_01.pngEXPORTED
ŷ = 51.6 + 4.2x 学习时长 × 考试成绩
研究报告report.docx
分析结果

模型拟合度R² = 0.42

复制数字 粘贴图表

数据或模型一旦更新,就需要重新导出、替换并逐项核对。

02
R Markdown 工作流一份源文件,重新生成全部成果
01
单一来源

文字、代码与输出共用一个版本

02
自动更新

数据变化后重新 Knit 即可同步结果

03
可复现

重新运行即可核对分析步骤与结果

04
交互呈现

网页可承载动态图表、地图与表格

05
Open Science

源文件便于共享、审查与继续扩展

唯一源文件chapter_1.Rmd
.Rmd
说明文字研究问题与结果解释
R 代码数据处理与分析步骤
图表与结果由代码运行后生成
一次 Knit重新生成多种成果
HTML PDF DOCX PPTX

3.1 使用场景

COURSE
课程作业

把分析步骤、代码和结果写在一起,教师可以看到完整过程。

RESEARCH
研究报告

数据或模型更新后重新生成表格和图形,减少手工替换。

TEAM
协作与复核

同伴能够查看结果来自哪段代码,也能按相同步骤复现分析。

REPORT
汇报与发布

同一份分析可整理为网页、课程报告或面向管理者的简报。

R Markdown 与生成式 AI

生成式 AI (Generative AI) 可以协助解释报错、补充代码注释或提出分析方案。结构清楚的 .Rmd 有助于提供代码及其上下文。提问时可附上相关代码块、完整报错和期望结果;涉及个人信息或受限数据时,不应直接上传原始数据。

AI 给出的代码仍需在本地运行并核对结果。保留 .Rmd 源文件和 Knit 生成的报告,便于对照代码、查看实际输出,并回看分析过程。

3.2 Knit 原理

Knit 的本义是“编织”。.Rmd 中写有说明文字与代码;点击 Knit 后,R Markdown 按文档顺序运行代码,再把文字、代码和产生的结果排入同一份输出文档。这个过程像把不同的线编织成完整布面。

Knit

生成完整文档

Knit 的四个步骤
01
读取设置

rmarkdown 读取 YAML。

02
运行代码

knitr 收集运行结果。

03
转换排版

Pandoc 转换内容。

04
生成文档

HTML、Word 或 PDF。

三种常用输出格式

  • HTML:适合网页教学和交互展示,也是本课程最常用的格式。
  • Word:适合继续编辑、批注或提交课程报告。
  • PDF:适合固定版式;首次生成 PDF 通常还要安装 TinyTeX 或其他 LaTeX 环境。

3.3 新建与预览

3.3.1 安装所需扩展包

RStudio 提供 Knit 按钮,并随软件提供 Pandoc。首次使用前,仍需确认 R 已安装 rmarkdown 包。下面的命令在 Console 中运行一次:

# 首次配置时在 Console 中运行
install.packages("rmarkdown")

rmarkdown 会同时安装所需的 knitr 依赖,因此一般无需再单独运行 install.packages("knitr")。

3.3.2 创建并保存文件

按下面三步新建文档

  1. 点击 RStudio 左上角 ,选择 R Markdown…。
  2. 填写标题 (Title) 和作者 (Author),输出格式先选择 HTML。
  3. 点击 OK 后立即保存。基础项目可将文件命名为 report.Rmd,放在项目根目录,与 .Rproj 文件同级。
新建 R Markdown 文档时填写标题、作者,并选择 HTML 作为起始输出格式

新建 R Markdown 文档时填写标题、作者,并选择 HTML 作为起始输出格式

截图中的标题、作者和日期仅作界面示例。RStudio 版本不同,窗口文字和排列可能略有变化。

3.3.3 在 Viewer 中查看网页

若 Knit 后总是弹出独立窗口,可以把预览固定在 RStudio 的 Viewer 面板中。按下面三个步骤完成设置:

步骤 1:点击 Knit 旁的齿轮,打开预览设置

步骤 1:点击 Knit 旁的齿轮,打开预览设置

步骤 2:选择 Preview in Viewer Pane

步骤 2:选择 Preview in Viewer Pane

步骤 3:需要完整页面时,点击 Show in New Window

步骤 3:需要完整页面时,点击 Show in New Window

设置完成后,每次 Knit,Viewer 都会刷新当前页面,便于及时检查文字、图表、代码输出和排版。需要检查不同窗口宽度、交互功能或发布后的浏览器效果时,再点击 Show in New Window 打开完整页面。

3.4 一份 Rmd 的四个部分

新建文档后,RStudio 会提供一份模板。下面四个部分共同决定文档写什么、运行什么,以及最后显示什么。

01YAML标题、作者与输出格式

YAML 文件头 (YAML header) 位于文档最上方,两组 --- 标出它的开始和结束。title 定义文档标题,output 决定生成哪种文件。

---
title: "课程练习"
author: "学生姓名"
date: "01/09/2026"
output: html_document
---

冒号后要留空格;多层设置使用空格缩进,不使用 Tab 键。

02setup 代码块统一设置全文代码块

setup 代码块通常放在 YAML 下方,用于加载包并设置全文默认选项。

```{r setup, include=FALSE}
knitr::opts_chunk$set(
  echo = TRUE,
  message = TRUE,
  warning = TRUE
)
```
  • include = FALSE:运行代码,但不在输出文档中显示代码、结果、消息或警告。
  • echo = TRUE:显示代码本身;结果是否显示由 results、include 等选项决定。
  • message = TRUE、warning = TRUE:保留后续代码块的运行提示和警告,便于检查问题。
03Markdown 正文研究问题、方法与解释

代码块之外的区域用于写正文。标题用来区分研究背景、分析过程和结果解释;段落之间留一个空行。

## 研究背景

本报告分析不同社区的公共服务可达性。
04R 代码块执行分析并生成结果

R 代码写在代码块 (code chunk) 中。r 表示使用 R 运行,descriptive_summary 是便于定位和排错的代码块名称。

```{r descriptive_summary}
summary(cars)
```

代码块名称在同一份文档中应保持唯一。Knit 会按文档中的先后顺序执行代码块。

Knit 通常使用独立的 R 会话

点击 RStudio 的 Knit 按钮时,Global Environment 中临时创建的对象不会自动进入新的 R 会话。包加载、数据读取和对象创建都应写进 .Rmd,并放在首次使用之前。

Knit 默认以 .Rmd 所在文件夹为工作目录;文档与 .Rproj 同级时,这个位置才与项目根目录一致。若代码在 Console 中能够运行、Knit 却报错,应检查对象是否完整创建,以及相对路径的起点是否一致。

选学:耗时较长的代码可以使用 cache = TRUE

cache = TRUE 会保存某个代码块的运行结果。代码和相关设置未改变时,下一次 Knit 可以复用缓存,从而减少等待时间。

```{r cached_summary, cache=TRUE}
summary(cars)
```

上例可以直接运行,用来展示缓存参数的写法;summary(cars) 运行很快,实际无需缓存。缓存更适合耗时较长、输入稳定的计算,不建议直接用于仍在频繁修改的数据读取和清理步骤。

需要留意:外部数据或上游参数已经变化时,当前代码块的文字可能没有变化,knitr 可能继续使用旧缓存。此时应清理该文档生成的缓存目录,再重新 Knit。正式提交前也应从头运行一次,确认结果可以完整重建。

3.5 Knit 前检查

01

文件已保存先保存 .Rmd,再开始 Knit。

02

包已在文档中加载所需 library() 写在首次调用函数之前。

03

数据路径有效文件放在项目目录中,路径与文件名一致。

04

对象按顺序创建每个对象都在使用之前由前面的代码块生成。

本节介绍了创建、组织和 Knit R Markdown 文档所需的基础操作。R Markdown 还支持参数化报告、参考文献、模板、网站和长篇文档等功能,可在具体项目中逐步学习。

学习进阶功能时,可以从正在完成的课程作业或研究项目出发,先明确需要解决的问题,再查阅文档或向 AI 提问。运行代码、核对输出和记录修改过程仍是确认答案是否可靠的必要步骤。

4.0 R Markdown 语法

4.0 R Markdown 语法

R Markdown 的常用语法可以分成两层:Markdown 负责组织标题、段落、列表、链接和图片;R 代码块负责运行分析并生成数值、图形和表格。先掌握下列常用写法,已经足以完成一份结构清楚的课程作业。

4.1 Markdown 如何组织正文

4.1.1 段落、空行与换行

在 R Markdown 中写普通文字,很像在 Word 正文里直接打字:把光标放在代码块之外,输入内容即可。需要记住两个编辑习惯——正文写在代码块之外;需要新起一段时,段落之间留一整行空白。Knit 后,Pandoc 才会把它们识别为两个清楚的段落。

推荐:分成两个段落
本研究关注社区公共服务差异。

下一步比较不同地区的可达性。
同一段内强制换行
数据来源:2021 年人口普查。  
分析尺度:街区。

行末输入两个空格,再按 Enter,可以在同一段内换行;也可在行末使用反斜杠 \。正式报告中,地址、诗行或需要紧密排列的短信息适合强制换行;一般正文使用空行分段更易阅读。

4.1.2 标题与层级 (Headers)

井号 # 的数量表示标题层级,井号后要留一个空格。标题层级同时决定目录结构,因此应按内容关系依次使用,不要只为改变字号而跳级。

输入 用途
# 报告标题 文档的最高层标题
## 研究背景 主要部分
### 数据来源 主要部分之下的小节
#### 变量说明 更细的内容层级
展开预览:一级、二级、三级标题的视觉层级
# 研究报告标题
一级标题研究报告标题文档最高层,用于整份报告的主标题。
## 研究背景
二级标题研究背景划分报告的主要部分,并进入目录。
### 数据来源
三级标题数据来源继续细分当前部分,字号和间距随层级收束。

不同主题会调整字体和颜色,但层级关系保持一致。写作时先确定内容结构,再选择对应数量的井号。

标题最常见的两个问题

  • ##研究背景 缺少空格,通常不会被识别为标题。
  • 从 ## 直接跳到 #### 会让目录关系不清楚。确有结构需要时可以跳级,但不应用它调节视觉大小。
4.1.3 强调、行内代码与转义
用途 输入 Knit 后
关键结论 **差异具有统计意义** 差异具有统计意义
轻量强调 *需要进一步核对* 需要进一步核对
已弃用内容 ~~旧变量名称~~ 旧变量名称
函数或对象 `mean()` mean()
上标与下标 km^2^、H~2~O km2、H2O

行内代码适合函数、参数、变量和文件名,例如 filter()、echo = FALSE 与 survey.csv。正文重点使用加粗即可;若连续多句都加粗,读者反而难以判断哪一处最重要。

Markdown 符号需要按普通字符显示时,在符号前加反斜杠。例如,输入 \* 会显示星号 *,不会开始斜体。常见转义写法还包括 \#、\_ 和 \[。

4.2 列表、链接与图片

4.2.1 列表:并列信息与操作步骤

无序列表适合并列要点,有序列表适合按顺序完成的步骤。符号后都要留一个空格;子列表统一缩进 4 个空格,不使用 Tab。

并列要点
- 数据来源
- 变量定义
- 分析限制
步骤与子任务
1. 读取数据
2. 检查变量
    - 核对缺失值
    - 统一变量类型
3. 绘制图形

有序列表也可以全部写成 1.,Pandoc 会在输出时自动编号。课程作业中直接写出实际序号通常更便于回看和修改。

4.2.2 链接与图片路径

链接和图片的写法很接近;图片语法只多一个感叹号 !。

内容 语法
叙述性链接 [R 官方网站](https://www.r-project.org)
项目内图片 ![研究区域位置图](images/study_area.png)

链接文字应说明打开后会看到什么,避免单独使用“点击这里”。图片方括号内填写替代文本 (alt text),简要说明图中最重要的信息,便于图片加载失败时识别内容,也能帮助屏幕阅读器使用者理解图像。

下面两张图片分别演示 PNG 和 SVG。页面使用保存在 images/ 中的副本,重新 Knit 时无需下载;图下注明原始来源,后面的代码示例展示网络图片的写法。

进阶:控制网络图片的尺寸、比例与透明度

最简洁的写法是在 Markdown 图片语法后添加 Pandoc 宽度属性:

![R 语言标志](https://www.r-project.org/Rlogo.png){width=34%}

需要同时控制居中、比例或透明度时,可以使用 HTML 的 <img> 标签:

<img
  src="https://www.r-project.org/Rlogo.png"
  alt="蓝灰色的 R 语言字母标志"
  style="display:block; width:36%; height:auto;
         margin:0 auto; opacity:.88;">
  • width 控制网页显示宽度,height: auto 按原始比例计算高度。
  • margin: 0 auto 让块级图片居中;opacity 的范围是 0 到 1,数值过低会影响辨认。
  • 固定展示区域时可使用 aspect-ratio: 16 / 9。object-fit: contain 会保留完整图片,object-fit: cover 会填满区域,但可能裁掉边缘信息。

也可以在 R 代码块中使用 knitr::include_graphics(),并通过代码块参数统一管理图注、替代文本、宽度和对齐方式:

```{r r_logo_web, eval=FALSE,
  out.width="36%", fig.align="center",
  fig.cap="R 语言标志",
  fig.alt="蓝灰色的 R 语言字母标志"}
knitr::include_graphics("https://www.r-project.org/Rlogo.png")
```

网络图片仍依赖原网站和网络连接。正式作业若强调长期复现,应在确认使用许可后把图片保存到项目的 images/ 文件夹,并改用相对路径。

项目内优先使用相对路径

若 .Rmd 位于项目根目录,图片位于 images 文件夹,可以写成 images/study_area.png。不要把 C:/Users/... 或个人桌面路径写进课程作业;换一台电脑后,这类绝对路径通常会失效。

用于 HTML 的静态图片优先选择 PNG、JPG 或 SVG。PDF 图片能否直接显示取决于浏览器和输出设置,不宜把它当作 HTML 页面中的通用图片格式。

4.2.3 用 R 代码块控制图片

需要控制网页显示宽度、对齐方式和图注时,可使用 knitr::include_graphics()。下面只设置宽度,让图片保持原始比例。

```{r study_area_map, echo=FALSE,
  out.width="68%", fig.align="center",
  fig.cap="研究区域及主要交通节点",
  fig.alt="地图显示研究区域边界与主要交通节点的位置"}
knitr::include_graphics("images/study_area.png")
```
  • out.width = "68%" 控制图片在网页中的显示宽度。
  • fig.align = "center" 使图片居中。
  • fig.cap 使用能说明图片内容的描述性图注,不在图注中手动添加序号。
  • fig.alt 提供替代文本,重点描述图中可见的信息。

同时固定 out.width 和 out.height 容易拉伸图片。确有裁切或固定尺寸需要时,应先确认宽高比例。普通 html_document 不会自动提供稳定的图号和跨页引用;长篇报告需要自动编号时,可进一步使用 bookdown 或 Quarto 的交叉引用功能。

4.3 引用、脚注与公式

4.3.1 区块引用与脚注

区块引用用于呈现引文或需要与正文分开的原话。每行开头使用 >,来源可以放在引用末尾。

> 数据缺失并不总是随机发生。
>
> — 研究方法课堂笔记

脚注用于补充出处、定义或不适合放进正文的简短说明。正文中放置脚注标记,文档其他位置写出对应内容:

本报告使用公开发布的汇总数据。[^data]

[^data]: 数据下载日期为 02/09/2026。

区块引用和脚注作用不同:引用保留一段独立内容,脚注把补充说明移到页面注释区域。

4.3.2 数学公式 (LaTeX Math)

短公式放在一对美元符号中,例如 $R^2 = 0.72$ 会显示为 \(R^2 = 0.72\)。需要单独占一行的公式使用两对美元符号:

\[ \bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_i \]

HTML 输出通常由 MathJax 在浏览器中显示公式;PDF 输出则依赖 LaTeX 环境。常用上下标、分数和求和符号通常都能正常转换,但复杂宏命令和额外 LaTeX 宏包在不同输出格式中可能表现不同。

选学:常用 LaTeX 公式写法

R Markdown 中的数学表达式使用 LaTeX 数学语法。先掌握常见结构,已经可以书写大多数基础统计公式。

用途 Rmd 中输入 Knit 后
上标与下标 $x_i^2$ \(x_i^2\)
分数与平方根 $\frac{a}{b}$、$\sqrt{x}$ \(\frac{a}{b}\)、\(\sqrt{x}\)
希腊字母 $\alpha$、$\beta$、$\mu$、$\sigma$ \(\alpha\)、\(\beta\)、\(\mu\)、\(\sigma\)
求和与均值 $\sum_{i=1}^{n}x_i$、$\bar{x}$ \(\sum_{i=1}^{n}x_i\)、\(\bar{x}\)
自动调整括号 $\left(\frac{a}{b}\right)$ \(\left(\frac{a}{b}\right)\)
回归方程 $y_i=\beta_0+\beta_1x_i+\varepsilon_i$ \(y_i=\beta_0+\beta_1x_i+\varepsilon_i\)

复杂公式适合先拆成“主体—上下标—括号”三部分,再逐步补全。每次 Knit 后核对括号、符号位置和输出格式;更多写法可查阅 R Markdown 数学公式说明。

4.4 普通行内代码与可执行行内 R

反引号既可以标出代码,也可以让 R 在 Knit 时计算一个短结果,两种写法需要区分。

Rmd 中输入:只展示代码 `mean(cars$speed)`

Knit 后仍显示函数文字:mean(cars$speed)

Rmd 中输入:计算并插入结果 `r round(mean(cars$speed), 1)`

Knit 后显示计算结果:15.4

行内 R 适合在句子中插入一个简短数值,例如样本量、均值或日期。较长的计算应放进有名称的代码块,再把已经创建的对象写进行内表达式,避免正文难以阅读。

行内 R 依赖前面的对象

行内表达式会在 Knit 时运行。它使用的数据、包和对象必须在文档前面已经准备好;否则即使 Console 中存在对象,Knit 仍可能报错。

4.5 创建和命名 R 代码块

4.5.1 三种创建方法
01Insert Chunk

点击编辑器工具栏的 Insert,选择 R。

02快捷键

Windows 使用 Ctrl + Alt + I。

03手动输入

输入三个反引号,并在开头写 {r}。

手动创建后的基本结构如下:

```{r descriptive_summary}
# 汇总汽车速度变量
summary(cars$speed)
```

r 指定运行语言,descriptive_summary 是代码块名称 (chunk label)。名称应简短、有意义,并且在同一份文档中保持唯一。本课程统一使用 snake_case:小写英文字母和数字之间可用下划线连接,例如 read_survey、clean_income、plot_age_group,不要使用空格或连字符。

为什么要给代码块起名字?

  • Knit 报错时,信息会直接指出对应的代码块,定位更快。
  • 缓存文件和自动生成的图片会带上代码块名称,便于核对来源。
  • 搜索和维护长文档时,clean_income 比“第几个代码块”更容易识别。

同一份文档中的代码块名称必须唯一。出现重名时,Knit 会停止并提示重复标签 (duplicate label)。

4.6 代码块参数与图形排版

代码块开头花括号内的参数控制“是否运行、显示什么、图形怎样排版”。多个参数用逗号分开。先理解用途,再选择需要的设置。

用途 参数 作用
是否运行 eval FALSE 时只展示代码,不执行
显示内容 include FALSE 时仍运行,但代码、结果、消息和警告都不进入文档
是否运行 cache TRUE 时可复用该代码块的缓存结果
显示内容 echo 控制是否显示代码本身
显示内容 message、warning 控制包消息与警告是否显示
显示内容 results 控制普通文本结果;常用值有 "markup"、"hide"、"asis"
图形排版 fig.width、fig.height 控制 R 绘图设备大小,通常以英寸为单位
图形排版 out.width 控制图形在网页中的显示宽度
图形排版 fig.align 设置左对齐、居中或右对齐
图形排版 fig.cap、fig.alt 设置图注和替代文本

echo = FALSE 只隐藏代码,运行结果仍会显示;eval = FALSE 则完全不运行代码。include = FALSE 常用于 setup 代码块,因为代码会运行,但相关内容全部隐藏。results = "asis" 要求结果本身已经是可直接插入文档的 Markdown 或 HTML,使用前应确认生成内容可信且格式正确。

调试时应先保留消息和警告,读懂并处理其中的问题。确认它们不影响结果后,再用 message = FALSE 或 warning = FALSE 整理正式输出;隐藏警告本身不会修复代码。

4.6.1 代码块参数生成器

下面的生成器把常用设置转换成代码块开头。它只写出已经改动的参数,避免代码块头部过长。调整选项后,可直接复制生成结果,再替换示例代码。

CHUNK BUILDER
生成常用 R 代码块

组合运行、显示、结果与图形排版设置。

已生成默认设置
使用小写英文、数字和下划线;同一文档中不要重名。
是否运行
显示内容
生成结果
```{r analysis_summary}
# 在这里写 R 代码
```

图形参数只在代码块生成图片时产生可见效果;调试阶段建议保留消息和警告。

4.6.2 图形大小:计算尺寸与网页尺寸

fig.width 和 fig.height 决定 R 生成图形时的画布比例与元素布局;out.width 决定这张图在网页上显示多宽。下面的图以 6.5 × 4 英寸生成,在正文中显示为 72% 宽度。

图中使用 R 自带的 cars 数据:speed 表示车速,单位为英里/小时;dist 表示停车距离,单位为英尺。

# 绘制车速与停车距离散点图
plot(
  cars$speed, cars$dist,
  xlab = "车速(英里/小时)",
  ylab = "停车距离(英尺)",
  pch = 19,
  col = "#2B7BBB"
)
散点图显示汽车速度增加时停车距离总体上升

汽车速度与停车距离的关系

图中文字拥挤时,先调整 fig.width 或 fig.height;图在页面中过大时,再调整 out.width。只为缩小网页显示而同时修改两组参数,往往会增加不必要的试错。

回顾:什么时候使用 cache = TRUE

cache = TRUE 适合耗时较长且输入稳定的模型或计算。代码文字没有变化时,knitr 可能复用旧结果;若外部数据或上游对象已经更新,应清理缓存并重新 Knit。报告定稿前应从头运行一次,确认结果可以重新生成。

4.7 表格

4.7.1 手动表格:适合规则和概念对照

表头下方的短横线不可省略;冒号控制对齐方向。

输入
| 变量 | 含义 |
|:---|---:|
| age | 年龄 |
| income | 收入 |
预览
变量含义
age年龄
income收入

手动表格适合少量、稳定的说明文字。真实数据一旦更新,手动复制容易遗漏,因此分析结果通常由 R 代码生成。

4.7.2 knitr::kable():把数据对象生成表格

下面从 R 自带的 mtcars 中选取四款车型和四个指标。车型名称先从行名移到普通列,避免输出时多出一列没有标题的行名。

# 整理需要展示的行和列
tab <- data.frame(
  model_name = rownames(mtcars)[1:4],
  mtcars[1:4, c("mpg", "cyl", "hp", "wt")],
  row.names = NULL,
  check.names = FALSE
)

# 将数据对象生成 HTML 表格
knitr::kable(
  tab,
  col.names = c("车型", "mpg", "cyl", "hp", "wt"),
  caption = "四款车型的部分性能指标",
  digits = 2,
  align = c("l", "r", "r", "r", "r")
)
四款车型的部分性能指标
车型 mpg cyl hp wt
Mazda RX4 21.0 6 110 2.62
Mazda RX4 Wag 21.0 6 110 2.88
Datsun 710 22.8 4 93 2.32
Hornet 4 Drive 21.4 6 110 3.21
  • caption 说明表格展示的对象和内容,不在标题中手动添加序号。
  • digits = 2 控制数值列的小数位。
  • align 中的 l、c、r 分别表示左对齐、居中和右对齐,数量应与输出列数一致。

网页表格列数较多时,应先保留真正需要比较的变量。本课程页面会让过宽表格在表格区域内横向滚动,但精简列数通常比缩小字体更易读。

选学:使用 kableExtra 做轻量美化

首次使用时在 Console 中运行 install.packages("kableExtra")。脚本中可在 kable() 后添加条纹、悬停和紧凑间距。避免写死大面积背景色,浅色与深色主题下更容易保持可读。

library(dplyr)

tab %>%
  knitr::kable(
    col.names = c("车型", "mpg", "cyl", "hp", "wt"),
    caption = "四款车型的部分性能指标"
  ) %>%
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE
  )

表格单元格内的微型图、复杂分组表头和条件着色留到具体研究报告中按需学习;基础作业先保证变量、单位、标题和数值含义准确。

4.8 进阶:常用 HTML 排版语句

Markdown 已经能够处理大多数正文排版。遇到同一段内换行、局部样式或折叠说明时,HTML 可以补充更精细的控制。以下写法主要面向 HTML 网页;输出为 Word 或 PDF 时,样式可能不同。

<br>强制换行

在同一段内换到下一行;连续两个 <br> 会形成视觉空行。

<p>...</p>独立段落

明确包住一个段落。一般正文仍优先使用 Markdown 空行分段。

<span>...</span>行内范围

给一句话中的少量文字添加类名或局部样式。

<div>...</div>块级容器

把多行内容组织成一个可统一排版的区域。

<hr>分隔线

分开两个主题;使用过多会打断连续阅读。

<sub> <sup>上下标

适合 H2O、km2 等简短文本;完整公式仍使用 LaTeX。

<h1>—<h6>六级标题

可以生成标题,但课程文档优先使用 #,目录更容易保持一致。

<kbd>...</kbd>键盘按键

适合显示 Ctrl + Enter 等快捷键。

完整示例:用 HTML 制作折叠说明
```{=html}
<details>
  <summary>查看变量说明</summary>
  <p><code>income</code> 表示家庭年收入。</p>
</details>
```

多行或多层 HTML 放进 {=html} 原始 HTML 围栏后,Pandoc 会按网页结构处理它。标签通常成对出现,开始标签 <p> 要有对应的结束标签 </p>;<br>、<hr> 和 <img> 属于常见的单标签。

先确认输出格式

HTML 标签适合网页中的局部调整。若同一份 .Rmd 还要生成 Word 或 PDF,应分别检查输出;跨格式写作优先使用 Markdown 语法和代码块参数。

4.9 排错与进阶资源

语法问题通常可以从报错位置附近开始检查:代码块反引号是否成对、花括号和引号是否闭合、参数之间是否有逗号、对象和文件是否在使用前已经创建。若需要向教师、同伴或生成式 AI 求助,下面的模板比只提供一张报错截图更容易定位问题。

排错信息模板
输出格式:HTML / Word / PDF
最小代码:只保留仍能复现问题的代码块
完整报错:从第一条 error 开始复制,不删减文件名和行号
实际结果:当前生成了什么,或停在哪一步
预期结果:希望看到什么
运行环境:必要时附上 sessionInfo()

分享前删除姓名、学号、访问令牌、个人绝对路径和受限数据。AI 给出的代码需要在本地逐行检查并运行;能够 Knit 完成,只说明代码执行成功,不代表分析方法和结果解释一定正确。

常用语法不必一次背完。完成具体作业时,可先从速查表定位写法,再回到 .Rmd 中运行和核对。

5.0 代码规范与引用

5.0 代码规范与引用

5.1 和 5.2 讨论 R 代码本身的写法:对象如何命名、代码如何分行、注释需要记录什么。这些规则适用于保存在 scripts/ 文件夹中的 .R 脚本,也适用于 .Rmd 里交给 R 运行的代码块。5.3 起转入 R Markdown 的文献引用。

先分清代码写在哪里

.R 文件保存 R 代码;.Rmd 同时包含 Markdown 正文和 R 代码块。命名、空格和注释用于整理交给 R 执行的代码;文献引用则需要在 .Rmd 的 YAML 和正文中设置,两者应分别检查。


5.1 R 代码风格

5.1.1 名称统一使用蛇形命名法

本课程的对象名、变量名、自定义函数名、文件名和代码块名称统一使用 蛇形命名法 (snake_case):英文小写,单词之间用下划线连接。

student_score <- c(72, 85, 91)
mean_score <- mean(student_score)
  • 采用:student_score、survey_data、clean_income
  • 不采用:StudentScore、student.score、x1

student.score 在 R 中可以运行,但点号也常见于旧代码和某些 R 函数的命名约定。一个项目混用多种写法后,搜索和检查会更费力,因此课程示例统一写成 student_score。

名称要能说明内容

survey_data 比 data1 更容易辨认,income_after_tax 比 x 更容易复查。循环计数等很短的局部代码可以使用 i,研究变量和中间结果应写出含义。

5.1.2 空格、换行与缩进保持一致

赋值符和运算符两侧留一个空格,逗号后留一个空格。代码过长时,在逗号或运算符后换行,并将下一行缩进。

# 清楚
average_income <- mean(household_income, na.rm = TRUE)

# 参数较多时分行
survey_data <- readr::read_csv(
  "data/survey.csv",
  na = c("", "NA", "-99")
)

让 RStudio 整理格式

选中代码后,使用菜单 Code → Reformat Code,或按 Ctrl + Shift + A(macOS 为 Cmd ⌘ + Shift + A)。自动格式化后仍需检查对象名和分行是否符合分析逻辑。


5.2 注释说明分析决定

注释以 # 开头,# 后留一个空格。有效的注释通常说明数据约定、处理原因或需要复查的地方。只复述函数名称的注释,隔一段时间再看时帮助有限。

信息较少

复述代码动作
mean_score <- mean(student_score) # 计算平均值

函数名已经说明计算内容,注释没有补充新的信息。

说明依据

记录数据编码
# 问卷用 -99 表示未回答;导入时统一转为缺失值
survey_data <- readr::read_csv(
  "data/survey.csv",
  na = c("", "NA", "-99")
)

这条注释保留了原始问卷的编码规则,后续可以据此检查缺失值处理。

较长脚本可用分节注释建立目录。RStudio 会识别以四个以上短横线结尾的注释,便于在文档大纲中跳转。

# 01 加载包 ----
library(tidyverse)

# 02 读取数据 ----
survey_data <- readr::read_csv("data/survey.csv")

# 03 清理变量 ----
# 在这里记录变量重编码及其依据

# 04 输出结果 ----
# 在这里生成表格和图形

注释不能代替方法说明

抽样方法、变量定义和模型选择等关键决定应写进报告正文。注释负责帮助阅读代码,正文负责说明研究方法及其依据。


5.3 文献引用

R Markdown 使用文献库保存作者、标题、期刊和年份等信息。正文只写引用键 (citation key);Knit 时,Pandoc 根据文献库和引用样式生成引注与参考文献表。

以下操作在 .Rmd 中完成

文献库路径写进 .Rmd 顶部的 YAML,引用键写进 Markdown 正文。.R 脚本不包含 YAML,也不会处理 [@wickham2014] 这类正文引用。

5.3.1 准备 .bib 文献库

在项目根目录建立 references/ 文件夹,将文献库保存为 references/references.bib。每条记录都有一个唯一引用键,例如 wickham2014。

@article{wickham2014,
  title   = {Tidy Data},
  author  = {Wickham, Hadley},
  journal = {Journal of Statistical Software},
  year    = {2014},
  volume  = {59},
  number  = {10},
  pages   = {1--23},
  doi     = {10.18637/jss.v059.i10}
}

引用键建议采用“作者姓 + 年份”,同一作者同一年有多篇文献时可写成 wickham2014a、wickham2014b。键名使用英文字母、数字和下划线,避免空格与中文标点。

5.3.2 在 YAML 中声明文件路径
---
title: "课程报告"
output: html_document
bibliography: references/references.bib
csl: references/apa.csl
---

bibliography 指向 .bib 文件。csl 指定引文样式 (Citation Style Language);尚未下载样式文件时,可以先删除这一行并使用默认格式。两条路径都从当前 .Rmd 所在位置开始计算。

5.3.3 在正文中调用引用键
用途 R Markdown 写法 常见显示方式
括号内引用 整洁数据便于后续分析 [@wickham2014]。 整洁数据便于后续分析(Wickham, 2014)。
作者进入句子 @wickham2014 提出了整洁数据原则。 Wickham(2014)提出了整洁数据原则。
同时引用多篇 相关研究已有讨论 [@wickham2014; @key2]。 两条文献按样式排列在同一组括号中。
标出页码 相关定义见原文 [@wickham2014, p. 4]。 引注中同时显示定位信息。

引用键必须与 .bib 中大括号后的名称完全一致,包括大小写。

5.3.4 指定参考文献表的位置

在需要显示参考文献的位置加入标题和 {#refs} 容器:

# 参考文献

::: {#refs}
:::

Knit 后,Pandoc 会把正文实际引用过的条目放入该容器。只有标题而没有 {#refs} 时,参考文献表通常仍出现在文档末尾,未必紧跟标题。

进阶:显示文献库中的全部条目

默认参考文献表只包含正文已经引用的条目。作业要求列出整个文献库时,可在 YAML 中加入:

nocite: '@*'

研究报告通常只列出正文实际引用的文献,因此使用 nocite 前应先确认提交要求。


5.4 Zotero 文献库

选学:Zotero × Better BibTeX 导出流程

手动编写一两条 BibTeX 记录便于理解结构。文献数量增加后,可用 Zotero 保存文献,并由 Better BibTeX 持续导出 .bib 文件。

  1. 在 Zotero 中建立课程或论文文献集合,并检查作者、年份、标题等信息。
  2. 安装 Better BibTeX 插件,为文献生成稳定的引用键。
  3. 右键文献集合,选择 Export Collection,格式选 Better BibTeX,勾选 Keep updated。
  4. 将文件导出到项目中的 references/references.bib,再在 YAML 中填写同一相对路径。

勾选 Keep updated 后,Zotero 会在文献变化时更新导出的 .bib。直接修改该文件的内容可能在下次自动导出时被覆盖;应回到 Zotero 修正文献信息。


5.5 引文排错清单

引注没有显示时,按顺序检查

  1. 检查路径:bibliography 和 csl 是否从当前 .Rmd 出发,并与实际文件名、大小写一致。
  2. 检查引用键:正文中的 [@wickham2014] 是否能在 .bib 中找到完全相同的键。
  3. 检查 BibTeX 结构:每条记录的大括号是否配对,字段之间是否有逗号。
  4. 检查引用位置:正文是否真正调用了该条目;需要列出全部条目时再使用 nocite: '@*'。
  5. 检查参考文献容器:需要固定列表位置时,确认文档中保留了唯一的 {#refs} 容器。

保留 Knit 的完整报错信息。File ... not found 通常指向路径问题,citeproc 附近的提示则常与引用键、BibTeX 字段或 CSL 文件有关。

6.0 章节练习与测评

6.0 章节练习与测评

本节包含三个环节。任务 1 提供可直接运行的模板,需要复制、修改并 Knit;任务 2 以小组为单位制作一份 R Markdown 报告,并在课堂展示本地 HTML;任务 3 通过选择题检查本章知识点。

01跟随示例复制、修改并 Knit
02小组实践与展示共同制作本地 HTML
03知识点自测选择答案并查看解析

任务 1:跟随示例运行

这一任务用于跑通“建立项目—整理文件—运行代码—Knit 网页”的过程。模板已经给出代码,需要逐段运行、查看输出,并至少修改一处文字和一组数据。

Step 1 创建项目
在 RStudio 中选择 File → New Project → New Directory → New Project,项目名称填写 exercise_lab1。打开项目后,确认右上角显示该项目名称。

Step 2 整理文件夹
在项目根目录建立 images/ 和 references/ 两个文件夹。模板会在 Knit 时生成 images/practice_minutes.png,无需预先准备图片。

Step 3 新建文档
选择 File → New File → R Markdown,将文件保存到项目根目录,文件名为 my_study_plan.Rmd。

Step 4 复制并运行模板
复制下方模板,替换姓名、学习目标和图片说明。先逐个运行代码块,确认平均值、表格、图形和运行时间都能显示,再点击 Knit 输出 my_study_plan.html。打开网页后,继续检查浮动目录、标签页和代码折叠按钮。

练习模板:my_study_plan.Rmd
---
title: "一周 R 学习记录"
author: "填写姓名"
date: "`r Sys.Date()`"
output:
  html_document:
    toc: true
    toc_float: true
    number_sections: true
    code_folding: show
    theme: flatly
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(
  echo = TRUE,
  warning = TRUE,
  message = TRUE
)
```

# 本学期目标

本学期计划完成 R 基础、数据整理和可复现报告练习。

## 每周安排

- 阅读课程材料
- 运行示例代码
- 整理报错与解决方法

1. 先打开 `exercise_lab1.Rproj`
2. 再打开 `my_study_plan.Rmd`
3. 完成修改后重新 Knit

课程语法可参考 [Posit Cheatsheets](https://posit.co/resources/cheatsheets/)。

# 一周练习记录 {.tabset}

## 数据摘要

本周每天的练习分钟数记为 $t_i$,周平均值为

$$
\bar{t}=\frac{1}{7}\sum_{i=1}^{7}t_i.
$$

```{r summary_stats}
# 记录七天的练习时长,单位为分钟
practice_minutes <- c(20, 35, 30, 45, 40, 60, 50)
mean_minutes <- mean(practice_minutes)
range_minutes <- range(practice_minutes)

c(
  平均值 = mean_minutes,
  最短时间 = range_minutes[1],
  最长时间 = range_minutes[2]
)
```

本周平均每天练习 `r round(mean_minutes, 1)` 分钟。

## 学习安排

```{r weekly_plan}
# 用一个小表格安排三次练习
study_plan <- data.frame(
  study_day = c("周一", "周三", "周五"),
  activity = c("运行示例", "整理笔记", "重新 Knit"),
  minutes = c(30, 40, 45)
)
knitr::kable(
  study_plan,
  col.names = c("学习日", "内容", "分钟"),
  caption = "本周 R 学习安排"
)
```

## 变化图

```{r practice_plot, fig.width=6.5, fig.height=4, out.width="75%", fig.align="center", fig.cap="一周内每天的练习时长", fig.alt="折线图显示七天练习时长从20分钟变化到50分钟"}
# 查看每天练习时长的变化
plot(
  seq_along(practice_minutes),
  practice_minutes,
  type = "b",
  xlab = "学习日",
  ylab = "分钟",
  pch = 19
)
```

## 运行时间

```{r timing_example}
# system.time() 记录大括号内代码从开始到结束所用的时间
runtime <- system.time({
  sorted_minutes <- sort(practice_minutes)
})
runtime
```

代码很短时,`elapsed` 可能接近 0。以后遇到运行较慢的代码块,可以用同样的写法记录等待时间。

# 保存并插入图片

```{r save_plot_file}
# 确保项目中存在 images 文件夹
invisible(dir.create("images", showWarnings = FALSE))

# 将练习时间图保存为项目内的 PNG 文件
png(
  "images/practice_minutes.png",
  width = 900,
  height = 560,
  res = 120
)
plot(
  seq_along(practice_minutes),
  practice_minutes,
  type = "b",
  xlab = "学习日",
  ylab = "分钟",
  pch = 19
)
invisible(dev.off())
```

```{r insert_saved_plot, out.width="65%", fig.align="center"}
# 使用相对路径插入刚刚生成的图片
knitr::include_graphics("images/practice_minutes.png")
```

# 完成检查

- [ ] 已修改一组练习分钟数
- [ ] `images/practice_minutes.png` 已生成
- [ ] 重启 R 后仍能 Knit 出 HTML

观察网页中的设置与结果

  • YAML 中的 toc_float 和 number_sections 会生成浮动目录与标题编号。
  • 标题后的 {.tabset} 会把同级标题整理成标签页。
  • code_folding: show 会为代码块添加显示或隐藏按钮。
  • system.time() 会输出代码运行时间。先看 elapsed,它表示从代码开始到结束经过的秒数;示例代码很短,结果可能接近 0。
  • png() 与 dev.off() 把图形保存为 PNG 文件,knitr::include_graphics() 再通过相对路径把图片插入网页。

修改其中一个参数后重新 Knit,比较网页前后的差别。

任务 1 完成标志

项目根目录中应能看到 .Rproj、my_study_plan.Rmd、my_study_plan.html、images/practice_minutes.png 和 references/。HTML 应显示浮动目录、标题编号、标签页、折叠代码、运行计时、图片、公式、行内结果、表格与折线图。完成后选择 Session → Restart R,再次 Knit;模板仍能生成网页才算跑通。


任务 2:小组实践与展示

在 exercise_lab1 项目中新建 group_report.Rmd。每组从下面三个 R 内置数据集中选择一个,共同制作一份可在浏览器中打开的 group_report.html。练习重点是把数据说明、代码、表格、图片和图形整理进同一份网页,供小组展示与讨论。

选择一个数据起点

三个数据集均随 R 安装,无需下载文件。第一次练习建议选择结构最简单的 cars;mtcars 和 airquality 可供希望多尝试一步的小组使用。

展开查看:数据集、行列含义与起步代码

表中的“每行”说明一行记录代表什么,“本次使用列”只列出练习需要的变量。其余变量留到后续数据分析章节再学习。

数据 规模 每行表示 本次使用列
cars 50 行、2 列 一组车速与停车距离观测 speed:车速;dist:停车距离
mtcars 32 行、11 列 一款汽车车型 wt:车重;mpg:每加仑燃油可行驶的英里数
airquality 153 行、6 列 1973 年纽约的一天 Temp:气温;Ozone:臭氧浓度,部分记录缺失

在 Console 中运行 ?cars、?mtcars 或 ?airquality,可以打开 R 自带的变量说明。绘图前应核对单位:例如 cars 的车速使用英里/小时,停车距离使用英尺。

下面仅提供数据起点:保留准备使用的赋值语句,其余两行保持注释状态。随后自行编写预览、表格与绘图代码。

# 三选一:保留准备使用的数据,另外两行保持注释状态
selected_data <- cars[, c("speed", "dist")]
# selected_data <- mtcars[, c("wt", "mpg")]
# selected_data <- airquality[, c("Temp", "Ozone")]

必要提示:head() 可查看前几行,summary() 可检查各列摘要;knitr::kable() 用于排成表格,plot() 的前两个参数分别指定横轴与纵轴数据。取列时可使用 selected_data[[1]] 和 selected_data[[2]],它们分别表示所选数据的第一列与第二列。

若选择 airquality,摘要结果会显示缺失值数量。计算臭氧均值时,可在 mean() 中设置 na.rm = TRUE,表示忽略缺失记录;正文应注明这一处理。

最容易的起点

选择 cars 后,可以围绕“车速较高时,停车距离的散点分布有什么变化”组织报告。这里只需描述图中看到的现象,不需要建立模型或作因果解释。

按四个阶段完成报告

Step 1 选定数据并看懂两列
从 cars、mtcars 或 airquality 中选择一个,运行折叠区中的起步代码。正文写明数据名称、一行记录代表什么,以及两列变量的含义。

Step 2 建立报告结构
YAML 至少包含 title、author、date 和 HTML 输出设置,author 可填写全部组员姓名。正文使用两到三个小标题,并建立 setup、data_preview 和 main_figure 三个有名称的代码块。代码块名称、对象名和文件名统一使用 snake_case。

Step 3 生成表格、图形和行内结果
使用 head() 或 summary() 查看数据,通过 knitr::kable() 生成一张表,并自行编写散点图代码。正文至少包含一处行内 R 结果,例如用 nrow() 或 ncol() 报告数据规模。图后用一两句话描述点的大致分布,不需要进行统计检验。

Step 4 补充材料并生成网页
使用相对路径插入一张本地图片,可以直接复用任务 1 生成的 images/practice_minutes.png,并填写图注或替代文字。报告还需加入一个真实外部链接。为散点图设置 fig.width、fig.height、out.width、fig.align、fig.cap 和 fig.alt;再从浮动目录、代码折叠或 tabset 中选择一项网页设置。保存文件后重启 R,再从头 Knit 出 group_report.html。提前完成的小组可以继续加入一处公式或一条文献引用。

Knit 失败时先查四处

检查 YAML 两端的 ---、标题符号后的空格、代码块的反引号与花括号,以及图片相对路径。Console 中已经存在的对象不会自动进入 Knit 会话,报告用到的数据和对象必须在 .Rmd 中读取或创建。

展示要点

  • 小组选择了哪个内置数据集,一行记录和两列变量分别表示什么。
  • 表格和图形显示了什么,正文怎样描述图中看到的现象。
  • 使用了哪项 R Markdown 设置,以及解决过的一个 Knit 或排版问题。

每位组员应能打开本地 HTML,并说明自己参与完成的部分。


展示前检查

任务 3:知识点自测

下面六道题涵盖项目路径、包管理、行内 R、Knit 会话、代码块参数和文献引用。选择答案后点击“检查答案”,页面会显示对应解析。

01group_report.Rmd 位于项目根目录,准备复用 images/practice_minutes.png。项目移动到另一台电脑后,哪种写法仍能正确定位图片?

02电脑已经安装 tidyverse。重启 R 后运行 select(),提示找不到函数。下一步应运行什么?

03哪种源码可以在正文句子中自动显示当天日期?

04survey_data 在 Console 中可以查看,但 Knit 提示 object 'survey_data' not found。最可靠的处理方式是什么?

05哪项设置会运行代码,同时隐藏该代码块产生的所有内容?

06正文已经成功引用文献。若要把参考文献表放在指定标题下,应在该位置加入什么?