数据挖掘与R语言

第3讲:Markdown语法与Quarto文档写作

2026年09月07日

本讲导览

Markdown & Quarto

  • 一、复习导入 ——为什么这节课要学Quarto?
  • 二、Markdown基础语法(精简版) ——标题、加粗、列表、表格
  • 三、Quarto文档结构 ——YAML头 + 正文 + 代码块
  • 四、代码块实战 ——把前两课代码搬进Quarto重新跑一遍
  • 五、随堂指导:完成实验报告1 ——后半节课的核心任务
  • 六、课堂总结与Exit Ticket ——检验今天的收获

提示

今天的目标是两件事:①学会用Quarto代码块把代码和结果一一对应地组织起来;②在老师指导下,当堂完成人生第一份《实验报告》。

一、复习导入

为什么这节课要学Quarto?

1.1 回顾脚本区运行代码的方式

上节课的代码运行:“代码和运行结果在不同的区域,代码和结果无法一一对应”

提问:麻烦在哪里?

  • 每运行一次,控制台就跳出来
  • 代码和结果多了以后,你不知道哪段代码对应哪个结果

1.2 复习:向量的隐式类型转换

顺带巩固上节课的“坑”:

▶️ 查看代码
c(1, "a")   # 1会被“降级”转换成字符串“1”
[1] "1" "a"

注记

口诀:“文本最强,遇串皆串”——R的隐式转换优先级为 逻辑型 < 整数型 < 数值型 < 字符串型,向量中只要混入一个字符串,整个向量都会变成字符串型。

1.3 为什么这节课要学Quarto?——和Script相比

第2课我们在Script(.R脚本)里写代码,选中一段代码运行——但运行结果去哪里看?

  • 数值结果 → 跳到Console面板看
  • 图形结果 → 跳到Plots面板看
  • 代码越写越多,很难说清“这个结果到底是哪一段代码跑出来的”

提示

Quarto最大的好处:把一份代码切成一个个任务(代码块,chunk),一个任务一段代码、一个结果,代码和结果紧挨着显示在一起。 哪怕之后代码写了几十段,也能一眼看清“这段代码 → 这个结果”,不用再来回切换Console和Plots面板去找。

二、Markdown基础语法(精简版)

标题、加粗、列表、表格——先学会写文字

2.1 常用语法一览:标题、加粗、列表

# 一级标题
## 二级标题

**加粗文字**   *斜体文字*

- 无序列表项一
- 无序列表项二

1. 有序列表项一
2. 有序列表项二

渲染后效果:加粗文字 斜体文字

注记

#的数量代表标题级别,#后面要留一个空格;掌握这几种语法,已经能应付大多数实验报告里的说明文字。

2.2 表格——财务场景:用表格呈现季度营收

| 季度 | 营收(万元) |
|------|------|
| Q1   | 120  |
| Q2   | 135  |

渲染后效果:

季度 营收(万元)
Q1 120
Q2 135

2.3 链接与代码的“纯文本展示”

[R语言官网](https://www.r-project.org)

`revenue`

渲染后效果:R语言官网

警告

行内的 `revenue` 只是文字排版,并不会运行——真正会运行的代码,要放进接下来讲的Quarto{r}代码块里。

2.4 课堂练习

用Markdown语法写一段自我介绍:

  • 包含一个标题
  • 一个加粗的姓名
  • 一个列表(写出你的2-3个专业技能或爱好)

三、Quarto文档结构

YAML头 + 正文 + 代码块

3.1 新建Quarto文件

  • 操作路径:File → New File → Quarto Document,选择输出格式(Word/PDF/HTML均可,此处先选Word)
  • 观察RStudio自动生成的模板文件(.qmd),指认其中的三个组成部分

3.2 YAML头 —— 文档的“身份证”

---
title: "我的第一份Quarto报告"
author: "你的姓名"
date: "2026-09-22"
format: docx
---

重要

YAML头必须放在文件最开头,用三个短横线---包裹;冒号:后面必须有一个空格,否则会报错。format是Quarto用来标记输出格式的设置项——不过我们今天更关心的是接下来要学的代码块,它才是Quarto和普通脚本最大的区别所在。

3.3 正文 —— Markdown文字与代码块交替出现

正文部分就是刚才学的Markdown语法,可以自由书写说明文字、标题、列表等

3.4 代码块(chunk)—— 把R代码嵌入文档

写在.qmd源文件里:


::: {.cell}
::: {.cell-output .cell-output-stdout}

```
[1] 3
```


:::
:::

运行这个代码块后:

▶️ 查看代码
1 + 2
[1] 3

这个代码块外观和刚才“仅展示代码”的Markdown代码块很像,但多了{r},意味着它会被真正执行

提示

小技巧:光标点进代码块内部,点击代码块右上角的绿色三角形(Run Current Chunk),就能单独运行这一块代码,结果直接显示在代码块下方——代码和结果紧挨着,一目了然,这就是1.3讲的“任务化”组织方式。

课堂练习(可穿插进行)

把第1课“基础运算”的几行代码(1+25-310%%3)放进一个新的{r}代码块,点击代码块右上角的绿色三角形运行,观察结果

四、代码块实战:把前两课代码搬进Quarto

不只是echo/eval,把两天内容全部认真练一遍

4.1 echo —— 要不要显示代码

写在.qmd源文件里:


::: {.cell}

```{.r .cell-code}
revenue <- c(120, 135, 128, 150)
revenue
```

::: {.cell-output .cell-output-stdout}

```
[1] 120 135 128 150
```


:::
:::

echo: true(默认):显示代码 + 显示结果 —— 运行这个代码块后:

▶️ 查看代码
revenue <- c(120, 135, 128, 150)
revenue
[1] 120 135 128 150

4.2 echo: false —— 只想呈现结论

写在.qmd源文件里:


::: {.cell}
::: {.cell-output .cell-output-stdout}

```
[1] 133
```


:::
:::

echo: false:只显示结果,不显示代码(适合只想呈现结论、不想暴露代码细节的场景)—— 运行后:

[1] 133

留意一下:上面这个框里没有出现任何代码,只有一个数字——这就是echo: false的效果。

4.3 eval: false —— 只想展示语法

写在.qmd源文件里:


::: {.cell}

:::

eval: false:只显示代码,不运行(适合展示语法、或代码涉及随机数不想每次运行都变化的场景)—— 效果:

▶️ 查看代码
sample(1:10, 5)

财务场景练习:把第2课“向量索引”的代码revenue[revenue > 130]分别用echo: trueecho: false跑一遍,对比呈现的区别

4.4 结果呈现参数 —— 简单了解

▶️ 查看代码
plot(revenue, type = "b")

fig-width/fig-height可以控制图形大小(图形与可视化会在项目四系统学习,这里先“眼熟”一下)

注记

注意到了吗:图形结果和代码一样,直接显示在这个代码块下方,不用再跳去Plots面板找——这正是1.3提到的Quarto相比Script的核心优势。另外warning: falsemessage: false可以抑制警告与提示信息,保持结果整洁。

4.5 行内代码(Inline code)—— 让数字“活”在文字里

写法:本季度平均营收为 133.2 万元(前后各一个反引号,r后跟一个空格)

运行后,这句话本身就会自动变成:

本季度平均营收为 133.2 万元

如果revenue数据变了,这句话里的数字会自动更新,不用手动改。

财务场景练习:用行内代码写一句话,自动引用revenue中最高季度的营收(提示:结合第2课学的max()which.max()

4.6 综合实战①:把第1课的变量赋值与运算代码搬进来

▶️ 查看代码
principal <- 20000    # 本金
rate <- 0.04           # 年利率
years <- 5             # 存款年限
principal * (1 + rate)^years   # 复利终值
[1] 24333
▶️ 查看代码
1234 + 5678
[1] 6912
▶️ 查看代码
1000 %/% 7
[1] 142
▶️ 查看代码
1000 %% 7
[1] 6
▶️ 查看代码
2^10
[1] 1024
▶️ 查看代码
sqrt(144)
[1] 12

课堂练习:把第1课“基础运算练习”里的题目逐条搬进新的代码块,逐个运行确认结果

4.7 综合实战②:把第2课的向量/因子/数据框代码搬进来

▶️ 查看代码
rating <- c("A", "B", "A", "C", "B")
rating_f <- factor(rating, levels = c("A", "B", "C"))
table(rating_f)
rating_f
A B C 
2 2 1 
▶️ 查看代码
company <- c("贵州茅台", "五粮液", "泸州老窖")
revenue_2025 <- c(1500, 680, 320)
df <- data.frame(company, revenue_2025)
df
   company revenue_2025
1 贵州茅台         1500
2   五粮液          680
3 泸州老窖          320

现场演示:给这两段代码分别配上一句Markdown说明文字(如“### 各公司评级分布”“### 各公司营收对比”),组成一份小型“迷你笔记”雏形——这份文件待会儿要用来支持你完成实验报告1

五、随堂指导:完成实验报告1

这是本课程的第一次实验报告——老师带着一起做

5.1 什么是“实验报告”

  • 从今天开始,每个项目/实验都要提交一份《成都锦城学院实验/实训报告》
  • 老师提供固定的Word模板:需要填写“目的及要求”“原理”“内容及过程记录”(含“实现代码”+“效果截图”)“结果与分析”等栏目
  • 这是第一份,主要复习第1、2课的内容,重点是熟悉模板长什么样、每一栏该填什么

5.2 任务①②解析:变量赋值与类型一致性

▶️ 查看代码
principal <- 20000
rate <- 0.04
years <- 5
principal * (1 + rate)^years
[1] 24333

任务②故意“挖坑”——设计一个类型不一致的向量:

▶️ 查看代码
mix_vec <- c(90, "良", 78)   # 数字与文字混在一起
mix_vec
[1] "90" "良" "78"
▶️ 查看代码
class(mix_vec)
[1] "character"
▶️ 查看代码
score_vec <- c(90, 85, 78)   # 全部是数值型
mean(score_vec)
[1] 84.3
▶️ 查看代码
class(score_vec)
[1] "numeric"

注记

这道题呼应1.2复习的“隐式类型转换”——mix_vec混入文字后整体变成了字符串型,无法直接参与mean()等数值运算;score_vec类型一致,才能正常计算。

5.3 任务③④解析:数列生成与向量统计

▶️ 查看代码
seq(0, 20, by = 2)
 [1]  0  2  4  6  8 10 12 14 16 18 20
▶️ 查看代码
sample(1:100, 10)
 [1] 78 89 15  4 29 52 80 55 20  1
▶️ 查看代码
sales <- c(112, 98, 135, 120, 108, 142)
sum(sales)
[1] 715
▶️ 查看代码
mean(sales)
[1] 119
▶️ 查看代码
which.max(sales)
[1] 6
▶️ 查看代码
which.min(sales)
[1] 2

5.4 任务⑤⑥解析:因子与数据框

▶️ 查看代码
grade <- c("优", "良", "中", "良", "优")
grade_f <- factor(grade, levels = c("优", "良", "中", "差"))
table(grade_f)
grade_f
优 良 中 差 
 2  2  1  0 
▶️ 查看代码
df <- data.frame(
  姓名 = c("张三", "李四", "王五"),
  分数 = c(95, 82, 88),
  等级 = c("优", "良", "良")
)
str(df)
'data.frame':   3 obs. of  3 variables:
 $ 姓名: chr  "张三" "李四" "王五"
 $ 分数: num  95 82 88
 $ 等级: chr  "优" "良" "良"
▶️ 查看代码
df$分数
[1] 95 82 88
▶️ 查看代码
df[df$分数 >= 90, ]
  姓名 分数 等级
1 张三   95   优

5.5 完成步骤(跟着做)

  1. 打开今天新建的Quarto文件,把5.2-5.4演示过的代码块整理好,逐个运行确认结果
  2. 打开实验报告模板“学号_姓名_实验报告1.docx”
  3. 逐条对照模板“内容及过程记录”里的6道题目,把对应代码复制、运行结果截图,分别填入“实现代码”和“效果截图”栏
  4. 在“结果与分析”栏,用1-2句话简单写一下你观察到的规律或结论(比如任务②里,两个向量的class()结果为什么不一样)
  5. 举手示意,老师会逐排巡视答疑

提示

今天课上能完成多少算多少,没做完的部分作为课后作业继续完成,下节课前提交。

六、课堂总结与Exit Ticket

检验今天的收获

6.1 本讲知识回顾

flowchart LR
    A["Markdown语法<br/>文字排版"] --> B["Quarto结构<br/>YAML+正文+代码块"]
    B --> C["运行代码块<br/>代码与结果紧挨着"]
    C --> D["行内代码<br/>数字自动更新"]
    D --> E["整理进<br/>实验报告模板"]

    style A fill:#1a3a5c,color:#fff
    style B fill:#2e5984,color:#fff
    style C fill:#7a4419,color:#fff
    style D fill:#375623,color:#fff
    style E fill:#4a2f6b,color:#fff

6.2 学习成果自查

对照一下,今天这几件事你都做到了吗?

  • ✓ 能够使用Markdown语法完成标题、列表、加粗、表格的排版
  • ✓ 能够创建Quarto文档并编写YAML头
  • ✓ 能够说出Quarto相比Script的最大好处:代码与结果一一对应,任务化组织
  • ✓ 能够单独运行代码块,代码和结果紧挨着显示
  • ✓ 能够使用行内代码将计算结果嵌入文字
  • ✓ 已经开始(或完成)第一份实验报告

提示

如果有没打勾的,下课后一定要找同学或老师补上,不要留到下一讲。

6.3 Exit Ticket —— 写给自己的三个问题

请花1分钟,在纸条或在线问卷上简要回答:

  1. Quarto文档和普通的.R脚本文件有什么不同?
  2. 跟Script相比,Quarto在结果呈现上解决了什么问题?
  3. 行内代码的好处是什么?

课后作业

完成并提交实验报告1

  • 如果课堂上已经完成实验报告1的全部内容,请检查一遍格式,按时提交
  • 如果没有完成,请利用今天整理好的.qmd文件,把剩余题目的代码运行结果截图,继续填写实验报告1模板

提交要求

提交实验报告1(学号_姓名_实验报告1.docx);作为辅助材料,请一并提交今天课堂上练习的.qmd源文件,确保里面的代码块都能独立运行、结果正确。本次作业计入平时成绩中的“实验报告”部分考核。

下讲预告

第4讲:矩阵、列表、数组——更多数据对象

  • 项目一“数据对象”部分收尾:矩阵(Matrix)、列表(List)、数组(Array)
  • 从下节课开始,继续用Quarto代码块整理实验作业,把代码和结果一一对应地组织起来

提示

课前准备:如果实验报告1还没提交,请课前补完;Quarto环境不需要额外准备,能正常打开.qmd文件、运行代码块就够了。

谢谢!

第3讲:Markdown语法与Quarto文档写作

"In God we trust; all others must bring data." — W. Edwards Deming,质量管理与统计学家

朱 奇 | 锦城大学 · 财会学院