设想你是一家餐厅最受欢迎的主厨,你的招牌菜靠的是一张写满步骤的菜谱:食材清单、火候、调料用量,全都记在同一张纸上。每次客人点单,你照谱下厨,端出的菜色香味分毫不差;换了帮厨,只要菜谱在手,味道也跑不了。万一客人觉得辣了、淡了,你只需要在菜谱上改一笔,下一盘菜立刻调整——而这一切,都不需要你重新“发明”这道菜。 R Markdown 之于数据分析,正是这样一张菜谱。它把文字叙述、分析命令、统计结果和图表全部写进同一个文档里,点一下“下厨”按钮,就能自动端出一份排版整齐的报告。数据变了?换一批食材再点一下,新报告立刻出锅,不用再手动复制粘贴图表、调整格式。本篇文章,我们就从这张“菜谱”的第一页讲起,一路看到 YAML 封面、火候调控、口味参数、开放厨房,最后是菜谱的版本档案柜。

岗位关联

掌握 R Markdown,你就能把“改数、重跑、截图、排版”的机械劳动交给文档自动完成,让报告从一次性交付物变成可持续复现的资产——这是数据岗位职业竞争力的分水岭。

目录
  1. 可视化演示
  2. RMarkdown入门:菜谱第一页
  3. YAML元数据:菜谱封面
  4. 代码块配置:火候与档位
  5. 参数化报告:同一菜谱,千人千味
  6. Shiny集成:开放厨房
  7. 版本与协作:菜谱的档案柜
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示RMarkdown Knit编译流程、代码块配置选项控制、以及多格式输出(HTML/PDF/Word),直观理解可复现数据分析报告。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Knit编译流程 RMD源文件含Markdown文本和R代码块 Knit引擎执行代码块生成图表和结果 RMD -> Knit -> Output(100% reproducible) Knit将RMD源文件编译为包含代码输出的可复现报告

RMarkdown入门:菜谱第一页

一张好菜谱不会只写“放盐少许”,它会写清楚食材清单、处理步骤、火候时长。R Markdown 文档(.Rmd 文件)就是分析界的这张纸:平时你分别存在 Word、R 脚本和 PPT 里的内容,在这里被写进同一个文件。文字、分析命令、图表不是三样东西,而是同一张“菜谱”的组成部分。

具体来说,一个 .Rmd 文件由三部分拼成:用 # 标题、` 加粗、- 列表写成的叙述文字(帮助读者理解“为什么”);夹在 {r} 标记之间的 R 代码块(负责“数据分析”这个动作);以及代码运行时自动生成、自动嵌入文档的图表和统计表。在 RStudio 里点一下 Knit 按钮,或者运行 rmarkdown::render("report.Rmd")`,脚本就会先把数据算完、再把文字和图排版好,最终输出一份完整报告。

可复现的根源就在这里:报告里的每一个数字、每一张图,都从同一份代码实时计算出来,而不是手工截图后贴进去的。数据源一更新,重跑一次,整份报告就跟着更新,绝不会出现“文字说增长了 20%,图却还是上个月的”这种尴尬。

有了这张“菜谱纸”,你就不再需要一个只会重复劳动的“抄写员”。数据改了,点一下 Knit,新报告自动出锅,味道分毫不差——这是可复现的第一个台阶,也是最关键的一步。

报告=Markdown 正文+R 代码运行结果+数据图表\text{报告} = \text{Markdown 正文} + \text{R 代码运行结果} + \text{数据图表}
  1. 报告(最终产物)等式左边是你要交付的 HTML、PDF 或 Word 文档,相当于整份菜谱下厨后端上桌的成品。
    报告\text{报告}
  2. Markdown 正文(叙述部分)用简单的符号写成的文字段落,负责讲故事、下结论、说明背景,是菜谱里的“步骤说明”。
    Markdown 正文\text{Markdown 正文}
  3. R 代码运行结果(计算部分)R 代码块执行后输出的数值、模型摘要和统计表格,是菜谱里“下锅翻炒”这个动作本身。
    R 代码运行结果\text{R 代码运行结果}
  4. 数据图表(摆盘部分)ggplot2 等绘图代码生成的图形被自动嵌入文档,数据一变,图片自动重画。
    数据图表\text{数据图表}

YAML元数据:菜谱封面

一本好菜谱的封面会写清菜名、作者、出版日期和印刷规格;R Markdown 文档最顶部那个用 --- 夹住的 YAML 块,就是这页封面。它虽然只有几行,却决定了整份报告“叫什么、谁写的、以什么样子出锅”。

YAML 块的书写规则很直观:key: value,一个键对应一个值。最常用的键有四个:title(报告标题)、author(作者)、date(日期)会直接印到报告的封面上;output 决定输出格式,比如 html_document(网页)、pdf_document(PDF)、word_document(Word)。output 后面还可以挂子选项,例如 toc: true 自动生成目录、number_sections: true 给章节编号,相当于在封面上写明“这本菜谱要附目录、页码”。

还有个特殊的键叫 params,它是在封面上预留的“口味参数位”——先空着,等下一节讲参数化报告时再填入具体数值。YAML 是文档的“契约”:封面怎么写,后厨就按什么规格出菜。

封面写清楚了,后厨才知道端什么盘子、送给谁。YAML 让每一次“烹饪”都能按同样的规格出锅,也让读者第一眼就知道这份报告是谁、在何时、以什么形式交付的。

YAML={title, author, date, output, params}\text{YAML} = \{\text{title},\, \text{author},\, \text{date},\, \text{output},\, \text{params}\}
  1. YAML(封面信息集合)花括号表示这是一个信息的集合,里面每一项都以“键:值”的成对形式存在,就像菜谱封面上的填空栏。
    YAML\text{YAML}
  2. title / author / date(署名信息)这三个键对应报告封面上的标题、作者与日期,是最基础的“名片”信息。
    title,author,date\text{title}, \text{author}, \text{date}
  3. output(出锅方式)指定报告以 HTML、PDF 还是 Word 格式输出,并可附带目录、主题等排版子选项。
    output\text{output}
  4. params(口味参数位)留给参数化报告的占位空间,允许在渲染时临时填入数值,实现“同一封面、不同口味”。
    params\text{params}

代码块配置:火候与档位

菜谱除了写步骤,还要写火候——大火爆炒还是小火慢炖,油温几成热。R Markdown 代码块的花括号里,同样藏着一排“火候旋钮”:在 {r} 后面用逗号隔开,写上 echo=FALSE、eval=FALSE 这样的选项,就能精确控制每一段代码的行为。

常用旋钮有这几个:echo 控制源代码要不要显示在报告里(设为 FALSE 就是“只上菜,不展示后厨”);eval 控制代码是否真的执行(FALSE 表示只展示代码、不运行);cache 把运算量大的代码块结果缓存到硬盘,下次渲染直接读取;fig.width 和 fig.height 控制图表尺寸;message 和 warning 则决定 R 的提示信息是否出现在报告里。如果想让整个文档统一设置,可以用 knitr::opts_chunk$set(echo=FALSE) 这类全局配置,一次拧好所有旋钮,单个代码块再局部微调。

错误处理也是火候的一部分:默认情况下代码报错会中断渲染,但教学文档里往往希望“即使这段报错,也继续往下走”,这时给代码块加上 error=TRUE 即可。火候调得准,做菜的人省心,吃菜的人舒心。

火候调对了,菜才不会烧焦。把 echo=FALSE 写进代码块,读者看到的是干净的结论和图表,而不是满屏的代码烟尘——报告的专业感,常常就藏在这些旋钮的细节里。

Output=knitr(code; θ),θ=(echo, eval, cache, fig.width)\text{Output} = \text{knitr}(\text{code};\, \theta), \quad \theta = (echo,\, eval,\, cache,\, fig.width)
  1. Output(出锅成品)一个代码块最终在报告里呈现的全部内容——可能只有一段文字,也可能是一张图加一句结论。
    Output\text{Output}
  2. knitr(code)(执行动作)knitr 相当于“下厨”这个动作本身,它负责运行 R 代码并把结果接回文档里。
    knitr(code)\text{knitr}(\text{code})
  3. θ(火候旋钮组)分号之后的希腊字母 θ 是一个参数向量,里面每一项都是代码块的一个选项,共同决定“这盘菜怎么做”。
    θ=(echo, eval, cache, fig.width)\theta = (echo,\, eval,\, cache,\, fig.width)
  4. echo / eval(两个主旋钮)echo 控制源代码是否显示在报告中;eval 控制代码是否真正执行——一个管“看不看得见”,一个管“做不做”。
    echo,  evalecho,\; eval

参数化报告:同一菜谱,千人千味

一家连锁餐厅想把同一道招牌菜卖到全国,不会为每个城市重新发明菜谱,只会在封面上加“辣度”“份量”两个参数:成都店选重辣,上海店选微辣,同一张纸,下厨时按参数调整即可。R Markdown 的参数化报告,做的就是这件事。

实现分两步。第一步,在 YAML 顶部声明参数,比如 params: region: "east";第二步,在正文里用 params$region 这样的语法引用它——渲染时,文档里所有出现这个参数的地方都会被替换成你传入的值。批量生成则交给 render 函数:rmarkdown::render("report.Rmd", params = list(region = "south")) 会渲染出一份“华南版”报告;把它放进一个循环里跑几遍,华东、华南、华北各一份,日报、月报、分区报表一次全部出锅。

这带来的效率提升是数量级的:以前做 12 个分区的周报,要复制粘贴 12 次、改数字 12 次、核对图表 12 次;现在只维护一份模板,改的是“参数输入”而不是“报告本身”,既快又不会漏改。

门店拿到同一张菜谱,按本地口味换参数,后厨一按按钮就出锅。参数化报告让“定制”和“批量”不再矛盾——你维护的永远是那一张基准菜谱。

Report(p)=render(template, p),p∈{p1,p2,…,pn}\text{Report}(p) = \text{render}(\text{template},\, p), \quad p \in \{p_1, p_2, \ldots, p_n\}
  1. Report(p)(带参数的菜品)输出报告是参数 p 的函数——参数不同,报告里的标题、数字、结论就不同;参数相同,报告永远一致。
    Report(p)\text{Report}(p)
  2. render(复刻动作)渲染函数把“模板”和“参数”两样东西结合,生成最终文档,相当于后厨按封面参数下厨。
    render(template, p)\text{render}(\text{template},\, p)
  3. p ∈ {p1,…,pn}(口味取值集合)参数可以取一组值,比如华东、华南、华北三个分区,就是三个参数取值。
    p∈{p1,p2,…,pn}p \in \{p_1, p_2, \ldots, p_n\}
  4. 批量生成(循环出菜)对集合里的每一个 p_i 调用一次 render,循环一圈,n 份不同参数的报告就齐了。
    Report(p1),Report(p2),…,Report(pn)\text{Report}(p_1), \text{Report}(p_2), \ldots, \text{Report}(p_n)

Shiny集成:开放厨房

普通菜谱是后厨的秘密,客人只能等着上菜;而 Shiny 把厨房改成了开放式——客人站在台前,亲手转动“辣度旋钮”“分量滑块”,当场看着菜的变化。R Markdown 与 Shiny 集成之后,静态报告就变成了这样一间“开放厨房”。

做法很简单:在 YAML 里加一行 runtime: shiny,文档就从“一次性烹饪”变成“互动餐厅”。页面会加载 Shiny 的交互组件,比如 selectInput(下拉框)、sliderInput(滑块)、checkboxInput(复选框);你在正文中编写响应逻辑,当用户拨动这些控件时,报告里的图表、表格和结论会立刻重新计算并刷新。客人自己选好想看的区域、时间窗口或假设条件,下一秒就看到对应的分析结果。

这种模式特别适合两类场景:一是企业内部的“自助分析台”,业务人员不写代码也能自己筛选参数、查看不同口径的数据;二是数据产品原型,用最少的代码快速验证“交互式分析”有没有价值。

开放厨房让食客从“被动等菜”变成“主动调味”,也让数据分析从“提交报告”进化成“对话数据”——而这一切,还是从那张 R Markdown 菜谱开始的。

output=f(input),input→reactiveoutput\text{output} = f(\text{input}), \quad \text{input} \xrightarrow{\text{reactive}} \text{output}
  1. input(客人拧的旋钮)用户界面上的滑块、下拉框等控件值,是互动分析的“输入”。
    input\text{input}
  2. reactive(响应链路)反应式编程让输入变化自动触发下游重新计算,无需手动刷新页面。
    input→reactive\text{input} \xrightarrow{\text{reactive}}
  3. output(桌面上呈现的菜)图表、表格、文字等输出内容,会随着 input 的变化实时更新,形成“拨一下、变一下”的体验。
    output\text{output}

版本与协作:菜谱的档案柜

名厨会把每一版菜谱收进档案柜,标注“2023 春季版”“更换供应商后版本”“客人反馈调整版”。数据分析师的菜谱,同样需要一个档案柜——不过它不是铁皮柜子,而是 Git 版本控制系统。

R Markdown 文件是纯文本,这给了它一个巨大优势:Git 可以逐行追踪它的变化。上周改了哪个数字、谁修改了哪段分析、这次提交和上次差在哪里,全部一目了然。对比之下,Word 是二进制格式,它能告诉你的只有“文件变了”,至于变了什么,得人肉对比。此外,renv 包可以为项目锁定 R 包版本,保证同事换台电脑、半年后重跑,渲染结果依然一致;配合 RStudio 的 Project 功能,把数据、脚本、报告按目录分层管理,整个项目就像一间井井有条的档案室。

最佳实践归纳起来有三条:先把分析思路理清再动手写代码;给文件和目录起有规律的名字,比如 01-data、02-scripts、03-reports;每次代码或数据有实质改动就及时提交 Git,并写清提交说明。做到这几点,任何一版报告都能随时回溯、随时重建。

档案柜的意义不在于“存了多少版本”,而在于“每一版都能讲清来龙去脉”。有了 Git + R Markdown,团队协作中的混乱、覆盖、丢失,都变成了可以无限回放的版本故事。

vt=commit(Δt, vt−1),history={v0,v1,…,vn}v_t = \text{commit}(\Delta_t,\, v_{t-1}), \quad \text{history} = \{v_0, v_1, \ldots, v_n\}
  1. v_t(第 t 版菜谱)当前版本,是档案柜里最新的那份记录。
    vtv_t
  2. commit(存档动作)提交操作把这次的“改动量”叠加到上一个版本之上,生成一个新版本号。
    commit(Δt, vt−1)\text{commit}(\Delta_t,\, v_{t-1})
  3. Δ_t(这次改了什么)希腊字母 Δ 表示两个版本之间的差异——在纯文本里,它精确到“哪一行、哪个字符”。
    Δt\Delta_t
  4. history(档案柜)所有版本串成一条按时间排列的历史链,任何时候都可以回到过去某一版重新出发。
    history={v0,v1,…,vn}\text{history} = \{v_0, v_1, \ldots, v_n\}

AI 应用场景

自动周报生产:一份模板,N 份报告

阶段:数据报告自动化与交付

解决的问题:传统做法是运营分析师每周从上一期 Word 复制模板,逐个改数字、截图贴图、调格式,12 个分区的周报往往要忙一下午,还容易漏改一处导致前后矛盾。用参数化 R Markdown 后,分析师只维护一份模板,把分区名作为 params 参数,写个循环调用 render,十分钟产出 12 份风格统一、数据实时计算的 HTML 周报。

具体案例:某电商公司数据团队每周一上午用同一份 .Rmd 模板,配合数据库导出的最新销售表,批量生成华东、华南、华北等 12 个区域的经营周报,并附上环比增长图表与结论摘要,直接分发到各区域负责人邮箱。

科研论文复现:审稿人也能“下厨”

阶段:科研数据与代码复现管理

解决的问题:论文投稿时,审稿人最担心的就是“图是不是 P 的、统计能不能重现”。用 R Markdown 写作论文,把数据清洗、统计分析、图表绘制、文字结论全部放进同一个 .Rmd 文件,审稿人拿到数据和代码后一键渲染,就能得到与论文完全一致的图表与数值,大大提升可信度。

具体案例:一位生物统计方向的研究生在投稿前,将论文的分析部分整理成一个带 params 的 R Markdown 文档,审稿意见要求换一种协变量调整方式时,只需改两行代码重新渲染,半小时内提交更新版。

企业自助分析台:把报告变成对话

阶段:交互式数据产品原型设计

解决的问题:业务部门频繁向数据团队提“帮我看看华东区上个月的退货率”,每次都要排队等排期。通过 runtime: shiny 把季度经营分析报告改造成交互式文档,业务人员自己拖动滑块选择区域和时间范围,图表和结论实时刷新,数据团队的重复取数需求大幅下降。

具体案例:某零售企业用 R Markdown + Shiny 搭建了“门店经营仪表盘”,店长在浏览器里选择门店编号和日期区间,即可看到该店的销量趋势、库存周转和异常预警,无需任何编程知识。

Python 演示

python67 行
# -*- coding: utf-8 -*-# mini_rmd.py: Python demo of reproducible report ideaimport datetime TEMPLATE = """---title: Weekly Sales Reportauthor: Data Assistantdate: {date}params:  region: {region}--- ## Sales Overview in {region} Total: {total} units, growth {growth}%. ## Breakdown {bars} ## Conclusion {summary}"""  def run_chunk(src, sales):    """Simulate knitr: execute code block and return variables"""    ns = {"sales": sales}    exec(src, ns)    return ns  def render_report(template, params, data_file):    """Simulate rmarkdown::render: template + params + data -> report"""    with open(data_file, "r", encoding="utf-8") as f:        sales = [int(x.strip()) for x in f if x.strip()]    code = """total = sum(sales)growth = round((total - 400) / 400 * 100, 1)summary = "target met" if growth >= 0 else "need effort""""    ns = run_chunk(code, sales)    bars = "\n".join("  " + "#" * (x // 20) + " " + str(x) for x in sales)    return template.format(        date=datetime.date.today(),        region=params["region"],        total=ns["total"],        growth=ns["growth"],        bars=bars,        summary=ns["summary"],    )  def main():    with open("sales_data.txt", "w", encoding="utf-8") as f:        f.write("120\n95\n150\n78\n")    for key, region in [("east", "East"), ("south", "South"), ("north", "North")]:        report = render_report(TEMPLATE, {"region": region}, "sales_data.txt")        fname = "report_{}.md".format(key)        with open(fname, "w", encoding="utf-8") as f:            f.write(report)        print("generated", fname)  if __name__ == "__main__":    main()
目的:用 60 多行 Python 复刻“模板 + 参数 + 代码块执行”的可复现报告流水线,帮助理解 R Markdown 的底层原理。
  1. TEMPLATE = """..."""报告模板相当于“菜谱”,把版式和占位符一次写死。
  2. ns = {"sales": sales}为代码块准备一个独立的“食材区”命名空间。
  3. exec(src, ns)模拟 knitr 执行代码块,运行结果存入命名空间。
  4. ns["total"]` / `ns["summary"]从命名空间取出计算结果,就像从后厨端出成品。
  5. template.format(...)用参数“填坑”,把占位符替换成真实数值,产出最终报告文本。
  6. for key, region in [("east", "East"), ...]循环传入不同参数,一份模板批量生成三份报告。
  7. with open(fname, "w", encoding="utf-8") as f:把每份报告落盘保存,相当于出锅装盘。

常见误区

误区我以为 R Markdown 只能做网页格式的报告,所以一直用 Word 写分析文档,觉得 R Markdown 不实用。

正解R Markdown 的 output 选项支持 html_document、pdf_document、word_document,甚至 beamer 幻灯片和 PowerPoint。只是输出 PDF 需要额外安装 LaTeX 排版系统(如 TinyTeX),输出 Word 需要安装 Pandoc。这就像同一张菜谱,既可以用蒸锅也可以用电饭煲,只是工具要配齐。

为何常见:大家最先接触到的教程几乎都用 HTML 演示,因为网页最容易打开、无需依赖,容易让人误以为 HTML 是唯一选择。

误区我一直以为报告里看不到代码,就代表这段代码没有执行,所以把不想要的代码块直接删掉。

正解echo 和 eval 是两个独立的旋钮:echo=FALSE 只是隐藏源代码,代码依然会执行、结果依然会呈现;只有 eval=FALSE 才会让代码“躺平不干活”。好比餐厅的开放式厨房改成封闭式,菜照样在炒,只是你看不到而已。

为何常见:初学者把“显示”和“执行”混为一谈,因为默认情况下两者总是同时出现,很少有机会区分它们各自的职责。

误区我以为参数化报告就是把模板复制十份,然后手动把每份里的“华东”改成“华南”,再一个个重新渲染。

正解真正的参数化是在 YAML 里声明 params,正文中用 params$xxx 引用,然后通过 render 循环传入不同的参数值。你维护的始终是一份模板,“改数字”变成“传参数”,既不会漏改,也不会改错地方。这跟连锁餐厅只维护一张菜谱、按门店传口味参数是同一个道理。

为何常见:没接触过模板引擎的人,天然会用“复制-粘贴-查找替换”的思路去批量做文档,难以想象“一份模板 + 参数”可以替代手工复制。

误区我以为 `runtime: shiny` 只是把报告发布到网上,加载速度和普通 HTML 报告差不多,随便部署就行。

正解Shiny 文档是交互式应用,每次用户拨动控件都会触发后端重新计算,对服务器资源和运行环境的要求远高于静态 HTML。普通报告渲染一次就“定型”了,Shiny 文档则要一直“热着锅”等待客人点单。生产部署要考虑并发、缓存和安全,不能当静态页面随手扔到服务器上。

为何常见:从外观看,Shiny 文档打开后也是一个网页,用户很难一眼看出它背后有一套持续运行的响应式计算引擎。

误区我习惯导出 HTML 后直接在里面改文字、改数字,觉得这样最快,改了就等于报告更新了。

正解R Markdown 的铁律是“一切以 .Rmd 为唯一事实来源”。直接改导出的 HTML,下次数据一更新、重新渲染,改动就被覆盖丢失了。正确做法永远是回到 .Rmd 修改,再重新渲染。就像菜谱改了却不更新原稿,下次做菜还是旧味道。

为何常见:改成品比改源码“立竿见影”,尤其是急着交报告的时候,人很容易图省事直接动最终文件,忽略了可复现的前提是“源头唯一”。

面试题

Q1. 在 R Markdown 的 YAML 头部中,声明参数化报告参数的关键字是?

单选题 · easy

  • A.params← 正确答案
  • B.output
  • C.runtime
  • D.author

答案:A。params 是在 YAML 封面预留的“口味参数位”,渲染时可通过它传入不同取值。output 决定输出格式,runtime 控制是否启用 Shiny,author 只是署名信息,都与参数化无关。

Q2. 代码块选项 echo=FALSE 的效果是?

单选题 · easy

  • A.不执行代码块
  • B.执行但隐藏源代码← 正确答案
  • C.不输出任何结果
  • D.执行但隐藏图形

答案:B。echo 管的是“源代码显不显示”,不是“代码跑不跑”。设为 FALSE 后代码照常执行,结果和图表正常呈现,只是读者看不到代码本身。想不执行应该用 eval=FALSE,两者像火候旋钮上的“显示”与“执行”两排开关,各管各的。

Q3. 要按同一模板批量生成多份不同参数的报告,应调用哪个动作?

单选题 · mid

  • A.新建文档向导
  • B.按参数重新渲染← 正确答案
  • C.保存为 Word 备份
  • D.手动替换图表截图

答案:B。批量生成的核心是循环调用 rmarkdown::render("template.Rmd", params = list(...)),每次都传入不同的参数值。“新建文档”会破坏模板的单一性,“手动替换截图”违背可复现原则,正确的做法永远是改参数、重渲染。

Q4. 在 .Rmd 正文中,引用 R 表达式值并嵌入文本的正确语法是?

单选题 · easy

  • A.花括号包裹代码
  • B.反引号加 r 执行内联← 正确答案
  • C.尖括号引用表达式
  • D.百分号包裹代码段

答案:B。在 Markdown 正文中写 ` r some_expression ,渲染时该表达式会被执行并把结果以文本形式嵌入,例如 r params$region ` 会输出区域名称。这是“把计算结果写进句子”的标准语法,花括号、尖括号、百分号都不是 R Markdown 的内联代码约定。

Q5. 要使 R Markdown 输出 PDF 文档,通常还需额外安装哪类软件?

单选题 · mid

  • A.Node.js 运行时
  • B.LaTeX 排版系统← 正确答案
  • C.MySQL 数据库
  • D.Apache 服务器

答案:B。PDF 排版需要 LaTeX 引擎(如 TinyTeX),它负责把 Markdown 转换后的中间文件编译成精美的 PDF。Node.js 是 JavaScript 运行时、MySQL 是数据库、Apache 是 Web 服务器,都与 PDF 输出没有关系。

Q6. 代码块选项 cache=TRUE 的主要作用是?

单选题 · mid

  • A.把数据缓存到磁盘
  • B.缓存代码运行结果← 正确答案
  • C.缓存外观样式资源
  • D.缓存生成的图片文件

答案:B。cache=TRUE 把代码块的运行结果缓存起来,下次渲染时若代码没变则直接复用,避免重复跑耗时的计算。但要注意:数据源变了必须清缓存重跑,否则读到的是旧结果——缓存是“省火候”,不是“改真相”。

Q7. 将 R Markdown 变为交互式 Shiny 文档的 YAML 设置是?

单选题 · hard

  • A.params: shiny
  • B.runtime: shiny← 正确答案
  • C.output: shiny
  • D.server: shiny

答案:B。在 YAML 中写 runtime: shiny 即可把文档切换为交互式应用,页面上的滑块、下拉框等控件会触发实时重算。params 是参数声明、output 是格式设置,server 并不是 YAML 顶层选项。

Q8. 以下哪些是 R Markdown 支持的常见输出格式?

多选题 · mid

  • A.HTML 网页← 正确答案
  • B.PDF 文档← 正确答案
  • C.Word 文档← 正确答案
  • D.Excel 表格

答案:ABC。R Markdown 原生支持 html_document、pdf_document、word_document 以及演示文稿等格式。Excel 是电子表格数据格式,不是报告文档的目标输出格式——虽然可以用代码导出 Excel 数据,但那不属于渲染管线的输出类型。

Q9. 关于可复现报告的价值,正确的说法是?

多选题 · hard

  • A.同一 Rmd 可反复渲染得到一致结果← 正确答案
  • B.修改数据后重新渲染即可更新图表← 正确答案
  • C.修改代码后重渲染会同步更新结论← 正确答案
  • D.编写 Rmd 能省去全部数据分析

答案:ABC。可复现的核心是“文档即源头”:数据和代码一变,重新渲染就能得到一致且更新的结果,这正是菜谱“照方抓药、味道不变”的承诺。但 Rmd 只是让分析过程可复现,不能替代数据分析本身——先有正确的分析,才有可复现的报告。

Q10. 关于 R Markdown 与 Word 文档的版本管理,正确的是?

多选题 · hard

  • A.Rmd 纯文本便于 Git 逐行比较← 正确答案
  • B.Word 二进制改动也能清晰 diff
  • C.改完 Rmd 必须重新渲染报告才更新← 正确答案
  • D.Word 修改后能自动同步代码结果

答案:AC。.Rmd 是纯文本,Git 能精确显示每一行的增删改;Word 是二进制格式,diff 只能提示“文件变了”却看不清细节。同时,Rmd 工作流强调“改源码、重渲染”,改动不会自动流入旧报告。Word 文档无法反向同步代码结果,因为代码根本不在 Word 里。