开篇:这门课到底能干什么?

大家好,欢迎来到《R Shiny 构建交互差异表达报告实操》的第一章。先说说我自己的经历。

几年前我还在做测序数据分析的时候,每次跑完差异表达,都要手动整理 Excel 表格,然后在 Word 里贴图、写说明。一份报告改个三五版是常事。最头疼的是——合作实验室的老师发来一句「能不能只显示 P 值小于 0.01 的基因?」。好嘛,重新跑一遍流程,重新出图,又是一下午。

那时候我就在想:要是有一份报告,能让对方自己点两下鼠标就完成筛选、切换、导出,该多省事。后来我遇到 R Shiny,才发现这东西简直是为生物信息学量身定做的。说白了,就是把你写的 R 脚本包装成一个网页应用,让别人也能用。

这门课的目标很简单:带你从零开始,构建一个能用的交互差异表达报告。不需要你提前懂 Web 开发,不需要你写过 HTML。只要你用过 R 做过差异表达,就能跟上。

学习目标:学完了你能干什么?

这一套课走下来,我希望你能做到三件事:

  • 看懂 Shiny 的骨架 —— 知道 ui 和 server 是怎么配合的。
  • 把静态分析变成交互工具 —— 让用户自己选阈值、切数据集、看图表。
  • 能部署给别人用 —— 不会只在你自己的电脑上跑得转。

嗯,听起来有点多。别担心,我们每个点都会拆开讲,配合实际的代码和案例。

课程安排:30 章我们都聊什么?

整个课程分成五个模块,节奏是从浅到深:

模块 章节 核心内容
基础篇 1-4 章 Shiny 架构、UI 布局、响应式编程
数据篇 5-10 章 数据导入、预处理、差异表达结果结构
可视化篇 11-18 章 火山图、热图、MA 图的自定义与交互
交互篇 19-25 章 筛选器、表格联动、下载报告
实战部署 26-30 章 性能优化、shinyapps.io 部署、Docker 打包
个人建议:前 10 章是地基,别跳。我以前带过一个学生,上来就想写热图交互,结果连 reactive() 和 observeEvent() 的区别都没搞明白,卡了整整三天。

Shiny 在生物信息学中的应用:为什么值得学?

你可能会问:Shiny 到底能用在哪些地方?我自己总结了三类最常见的场景。

第一类:交互式数据探索。
传统分析流程是「分析 → 出图 → 看结果 → 再分析」。Shiny 把这个循环变成了实时的。用户可以直接在网页上调节参数,图会跟着变。你想想看,这在探索性数据分析(EDA)阶段有多方便。

第二类:报告自动化。
不只是差异表达。我见过有人用 Shiny 做单细胞聚类结果的交互报告,还有人做药物筛选的剂量-反应曲线工具。Shiny 的好处是:你写一次,别人就能重复用。

第三类:团队协作。
生物信息学团队里往往有多个方向的同事:有人做比对、有人做注释、有人做统计。Shiny 可以把这些模块整合到一个界面上,每个人负责自己的那部分,最后拼成一个完整的报告工具。

避坑指南:我曾经在一个项目中把 Shiny 当成了「万能工具箱」,把所有计算都放在前端。结果用户点一下按钮,服务器要跑 10 分钟。后来我才学会:重量级计算要放到后台,UI 只负责展示和触发。这个原则我们后面会反复提到。

我们的第一个 Shiny 应用长什么样?

不多说理论了,先让 Shiny 跑起来。你安装好 shiny 包后,试试下面这段代码:

library(shiny)

ui <- fluidPage(
  titlePanel("Hello Shiny"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins", "Number of bins:", 1, 50, 30)
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
)

server <- function(input, output) {
  output$distPlot <- renderPlot({
    x <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    hist(x, breaks = bins, col = 'steelblue', border = 'white')
  })
}

shinyApp(ui = ui, server = server)

这段代码做了什么?ui 定义了页面上有什么(标题、滑动条、图表区域),server 定义了当用户滑动条变化时,图表怎么更新。你可以在 RStudio 里直接运行,会在浏览器里弹出一个页面。

核心知识点:
  • fluidPage() —— 响应式页面容器。
  • sidebarLayout() —— 左侧输入、右侧输出的经典布局。
  • sliderInput() —— 一个可交互的输入控件。
  • plotOutput() 和 renderPlot() —— 输出与渲染的配对。

我的第一个 Shiny 应用就是照着这个模子改出来的。当时我把 histogram 换成了火山图,把滑动条换成了 P 值阈值筛选条。虽然现在看来很简陋,但那是我第一次感受到「用户能自己控制分析结果」的爽感。

后面课程里,我们会把这个雏形一步步扩展成真正的差异表达报告工具。

本章知识体系总览

为了让你对第一章的全貌有个直观印象,我画了一张图。它概括了我们要了解的四个层次:课程定位(为什么学)、课程结构(学什么)、Shiny 核心概念(怎么学)、以及最终产出(学到什么程度)。

第一章:课程介绍与 R Shiny 概述 课程定位与目标 30 章课程架构 Shiny 核心概念 实际应用场景 交互数据探索 报告自动化 团队协作整合 本章核心产出 理解 Shiny 在生信分析中的定位 · 搭建第一个 Shiny 应用

你看,这门课不是一上来就让你写复杂界面。先从定位和结构入手,再亲手跑通一个最简单的例子。之后每章都围绕一个具体的功能点展开,一步步把报告工具搭起来。

一个小建议:如果你是第一次接触 Shiny,别着急把代码全看懂。先感受一下「输入-输出-响应」这个循环。后面的章节会逐一拆解每个函数的含义。

好啦,第一章就到这里。内容不多,但这两件事我希望你带走:Shiny 是为了让分析结果可以被交互式使用而生的;我们的最终目标是一份可部署的差异表达报告工具。