一、Shiny 是什么?为什么学它?
✅ 定义:
Shiny 是由 RStudio 官方开发的一个 R 语言网页应用框架 ,
能让你用最熟悉的 R 代码,快速开发出可交互的网页可视化系统。
🔹一句话总结:Shiny = "R + Web"
让数据分析师秒变网页开发者。
✅ Shiny 能做什么?
| 应用场景 | 实例 |
|---|---|
| 📊 数据可视化仪表盘 | 实时展示销售趋势、学业成绩、科研结果等 |
| 🧠 模型预测界面 | 输入参数 → 模型计算 → 输出预测 |
| 📈 动态报表系统 | 用户选择条件 → 自动生成分析图表 |
| 🗺️ 地理数据分析 | 使用 leaflet 实现交互式地图分析 |
| 🧮 数据探索工具 | 上传 CSV,实时查看统计信息与图表 |
✅ Shiny 的优势
-
无需 JavaScript / HTML / CSS 基础;
-
支持所有 R 包(ggplot2、plotly、DT、leaflet 等);
-
支持交互式输入与动态计算;
-
可一键部署到网页(shinyapps.io、Shiny Server);
-
学术展示 + 数据分析 + 企业内报表 一站式解决。
🧩 二、Shiny 的基本结构与原理
一个 Shiny 应用最核心的结构是两个部分:
ui # 用户界面(User Interface) server # 服务器逻辑(Server Logic)
二者通过 input 与 output 变量进行通信:
用户在UI输入数据(input)
↓
server响应并计算(output)
↓
结果返回到UI界面更新
🎯 最小示例:
library(shiny)
ui <- fluidPage(
titlePanel("Hello Shiny!"),
sidebarLayout(
sidebarPanel(
sliderInput("num", "样本数:", min = 10, max = 500, value = 100)
),
mainPanel(
plotOutput("histPlot")
)
)
)
server <- function(input, output) {
output$histPlot <- renderPlot({
hist(rnorm(input$num), col = "skyblue", border = "white")
})
}
shinyApp(ui = ui, server = server)
运行后:
-
左边是滑动条控制样本数量;
-
右边直方图实时更新。
🧱 三、UI 设计详解(界面组件大全)
| 类型 | 函数名 | 功能 |
|---|---|---|
| 输入控件 | textInput() |
文本输入 |
| 输入控件 | sliderInput() |
滑动条数值输入 |
| 输入控件 | selectInput() |
下拉选择框 |
| 输入控件 | fileInput() |
上传文件 |
| 输出控件 | plotOutput() |
显示图表 |
| 输出控件 | tableOutput() |
显示表格 |
| 输出控件 | verbatimTextOutput() |
显示文本/控制台输出 |
| 布局函数 | fluidRow()、column() |
网格布局 |
| 页面样式 | fluidPage()、dashboardPage() |
基础页面结构 |
🧠 四、响应式编程逻辑(Reactive)
Shiny 最核心的机制是 响应式(Reactive)。
它能自动跟踪依赖关系:
当输入(input)变化时,Shiny 会 自动重新计算并更新输出(output)。
🌿 示例:
reactive_data <- reactive({
rnorm(input$num)
})
reactive_data() 会自动感知 input$num 的变化。
响应式函数类型:
| 类型 | 用法 | 说明 |
|---|---|---|
reactive() |
reactive expression | 返回数据(数据变化会触发重算) |
renderPlot() |
输出图像 | |
renderTable() |
输出表格 | |
renderText() |
输出文字 | |
observe() |
响应变化但不返回值(常用于事件触发) |
🧰 五、实战案例:Iris 数据交互式仪表盘
🎯 目标:
制作一个交互网页:
-
用户可选择变量(X、Y轴)
-
筛选不同物种
-
实时绘制散点图 + 展示数据表格
(1)加载依赖包
library(shiny) library(shinydashboard) library(ggplot2) library(DT)
(2)UI 界面设计
ui <- dashboardPage( dashboardHeader(title = "Iris 数据交互分析"), dashboardSidebar( selectInput("xvar", "X 轴变量", names(iris)[1:4], "Sepal.Length"), selectInput("yvar", "Y 轴变量", names(iris)[1:4], "Petal.Length"), selectInput("species", "物种筛选", c("All", unique(iris$Species))) ), dashboardBody( fluidRow( box(title = "散点图", width = 8, plotOutput("scatterPlot")), box(title = "数据表格", width = 4, DTOutput("dataTable")) ) ) )
(3)服务器逻辑实现
server <- function(input, output) { # 响应式数据过滤 filteredData <- reactive({ if (input$species == "All") iris else subset(iris, Species == input$species) }) # 绘制散点图 output$scatterPlot <- renderPlot({ ggplot(filteredData(), aes_string(x = input$xvar, y = input$yvar, color = "Species")) + geom_point(size = 3, alpha = 0.7) + theme_minimal() + labs(title = "Iris 数据可视化", subtitle = paste("X:", input$xvar, "| Y:", input$yvar)) }) # 显示数据表格 output$dataTable <- renderDT({ datatable(filteredData()) }) }
(4)运行应用
shinyApp(ui, server)
🔹结果:
-
左侧选择不同物种(如 setosa、versicolor、virginica)
-
右侧图表和数据表自动更新
-
无需刷新页面,完全实时!
⚙️ 六、进阶实战扩展
(1)上传 CSV 文件并动态绘图
fileInput("file", "上传 CSV 文件", accept = ".csv") observe({ req(input$file) data <- read.csv(input$file$datapath) output$preview <- renderDT({ datatable(head(data)) }) })
(2)添加下载功能
downloadButton("downloadData", "下载当前数据") output$downloadData <- downloadHandler( filename = function() { paste("iris_filtered_", Sys.Date(), ".csv", sep = "") }, content = function(file) { write.csv(filteredData(), file, row.names = FALSE) } )
(3)加入主题美化
library(shinythemes) ui <- fluidPage( theme = shinytheme("flatly"), titlePanel("Shiny Theme Demo"), ... )
推荐主题:
-
flatly(清新) -
cerulean(亮蓝) -
darkly(暗色风) -
cosmo(商务风)
(4)加入交互式 Plotly 图
library(plotly) output$interactivePlot <- renderPlotly({ plot_ly(filteredData(), x = ~Sepal.Length, y = ~Petal.Width, color = ~Species, type = "scatter", mode = "markers") })
🚀 七、部署上线教程
✅ 方法1:Shinyapps.io(最简单)
-
在 RStudio 登录:
install.packages("rsconnect") library(rsconnect) rsconnect::setAccountInfo(name='你的账号', token='xxx', secret='xxx') -
一键部署:
rsconnect::deployApp('你的应用路径')
✅ 方法2:Linux 自建服务器
sudo apt-get install shiny-server sudo systemctl start shiny-server
默认访问:http://your_server_ip:3838/
🧾 八、完整项目结构建议
project/ ├─ app.R # 主程序 ├─ data/ │ └─ iris.csv ├─ www/ │ ├─ style.css # 自定义样式 │ └─ logo.png ├─ modules/ │ └─ filter_module.R # 模块化组件
📚 九、学习路线建议
| 阶段 | 内容 | 建议工具 |
|---|---|---|
| 入门阶段 | 基本UI + server | shiny、shinydashboard |
| 实战阶段 | 动态数据、交互控件 | DT、ggplot2、plotly |
| 高级阶段 | 模块化开发、主题、美化 | bslib、shinythemes |
| 部署阶段 | 上线与管理 | shinyapps.io、Shiny Server |
🧩 十、总结
Shiny 让 数据分析师无需懂网页技术 ,即可独立完成 交互式数据可视化系统 的开发与发布。
-
🚀 开发快:纯 R 代码即可生成网页;
-
💡 交互强:输入-输出实时响应;
-
🌍 部署简:支持云端或服务器发布;
-
📊 可扩展:支持地图、模型、数据库、机器学习集成。