化代码为网页神器,变分析为在线工具。
本文教你用最简单的方法,把R脚本变成人人都能用的网页工具。
为什么要把代码变成网页?
想象两个场景:
场景A(传统方式)你写了一个超棒的R脚本,能自动分析销售数据。同事小李需要用时,你得:
场景B(Shiny方式)你把脚本变成了网页应用。小李需要时:
哪个更高效?显然是B。这就是Shiny的魅力——让代码从私有工具变成公共服务。
更棒的是,学习Shiny比你想的简单。今天,我就用最少的代码,带你创建第一个网页应用。
1、Shiny快速入门
1.1 准备工作
只需要一步:安装Shiny包。
install.packages("shiny")
等安装完成后,你的RStudio就拥有了创建网页应用的能力。
1.2 最简单的Shiny应用
创建一个新R脚本,输入以下代码:
library(shiny)# 1. 设计界面ui <- fluidPage( h3("我的第一个网页应用"), sliderInput("num", "选个数字:", 1, 100, 50), textOutput("text"))# 2. 处理逻辑server <- function(input, output) { output$text <- renderText({ paste("你选了:", input$num) })}# 3. 运行应用shinyApp(ui, server)
保存文件,点击“Run App”,奇迹发生了——你的R代码变成了网页!
1.3 理解这三部分
UI部分:用户看到什么
Server部分:程序做什么
响应式:用户一滑动滑块,文字自动更新
这就是Shiny的核心:界面收集输入 → 逻辑处理数据 → 显示结果。
2、创建实用工具
2.1 数据表格查看器
经常查看mtcars数据?做个网页版查看器:
library(shiny)ui <- fluidPage( titlePanel("汽车数据查看器"), sidebarLayout( sidebarPanel( selectInput("var", "选择变量:", choices = names(mtcars)) ), mainPanel( plotOutput("plot"), tableOutput("table") ) ))server <- function(input, output) { output$plot <- renderPlot({ hist(mtcars[, input$var], main = paste(input$var, "分布"), xlab = input$var, col = "lightblue") }) output$table <- renderTable({ head(mtcars[, c("mpg", "cyl", input$var)]) })}shinyApp(ui, server)
运行后,你可以:
2.2 添加更多交互
想让工具更好用?加几个功能:
# 在sidebarPanel里添加numericInput("rows", "显示行数:", 10, 1, 32),checkboxInput("show_plot", "显示图表", TRUE)# 在server里修改output$table <- renderTable({ head(mtcars, input$rows)})
现在可以控制显示多少行数据,还能开关图表显示。
3、打造个人学习记录器
3.1 记录学习进度
创建一个简单但实用的学习记录器:
library(shiny)ui <- fluidPage( titlePanel("学习进度记录器"), sidebarPanel( textInput("topic", "学习内容:", ""), numericInput("time", "学习时长(分钟):", 0), actionButton("save", "保存记录") ), mainPanel( h4("今日学习记录"), tableOutput("records"), plotOutput("progress") ))server <- function(input, output, session) {# 用来存储记录 values <- reactiveValues(data = data.frame( 内容 = character(), 时长 = numeric(), 时间 = character() ))# 保存记录 observeEvent(input$save, { new_row <- data.frame( 内容 = input$topic, 时长 = input$time, 时间 = format(Sys.time(), "%H:%M") ) values$data <- rbind(values$data, new_row) })# 显示记录 output$records <- renderTable({ values$data })# 显示进度图 output$progress <- renderPlot({if (nrow(values$data) > 0) { barplot(values$data$时长, names.arg = values$data$内容, main = "今日学习时长分布", col = "steelblue") } })}shinyApp(ui, server)
这个应用可以:
虽然数据关闭页面后会丢失,但对于单次使用完全足够。
3.2 添加数据保存功能
想让记录永久保存?添加文件操作:
# 在server开始处添加if (file.exists("study_log.csv")) { saved_data <- read.csv("study_log.csv")} else { saved_data <- data.frame(内容=character(), 时长=numeric(), 日期=character())}# 修改保存逻辑observeEvent(input$save, { new_record <- data.frame( 内容 = input$topic, 时长 = input$time, 日期 = as.character(Sys.Date()) ) write.table(new_record, "study_log.csv", append = TRUE, sep = ",", col.names = !file.exists("study_log.csv"), row.names = FALSE) showNotification("记录已保存!")})
现在数据会保存到CSV文件,下次打开应用还能看到。
4、创建计算器类工具
4.1 简单计算器
有时候需要重复计算,做个专用计算器很方便:
library(shiny)ui <- fluidPage( titlePanel("BMI计算器"), sidebarPanel( numericInput("height", "身高(cm):", 170), numericInput("weight", "体重(kg):", 65), actionButton("calc", "计算BMI") ), mainPanel( h3("计算结果"), verbatimTextOutput("result"), plotOutput("chart") ))server <- function(input, output) { bmi <- eventReactive(input$calc, { height_m <- input$height / 100 input$weight / (height_m * height_m) }) output$result <- renderPrint({ bmi_value <- bmi() cat("身高:", input$height, "cm\n") cat("体重:", input$weight, "kg\n") cat("BMI:", round(bmi_value, 1), "\n")# 判断体型if (bmi_value < 18.5) { cat("体型: 偏瘦") } elseif (bmi_value < 24) { cat("体型: 正常") } else { cat("体型: 偏胖") } }) output$chart <- renderPlot({# 简单图表 categories <- c("偏瘦", "正常", "偏胖") values <- c(18.5, 24, 40) # 分界点 plot(1, type="n", xlim=c(15, 35), ylim=c(0, 1), xlab="BMI", ylab="", yaxt="n") abline(v=c(18.5, 24), lty=2, col="gray") points(bmi(), 0.5, pch=19, col="red", cex=2) })}shinyApp(ui, server)
这个BMI计算器:
你可以用这个模板做各种计算器:房贷计算、税费计算、单位换算等。
4.2 更通用的计算模板
想要创建其他计算器?记住这个模板:
# 计算器通用模板library(shiny)ui <- fluidPage( titlePanel("你的计算器名称"),# 输入参数 numericInput("param1", "参数1:", 0), numericInput("param2", "参数2:", 0),# 计算按钮 actionButton("calc", "开始计算"),# 结果显示 verbatimTextOutput("result"))server <- function(input, output) { result <- eventReactive(input$calc, {# 在这里写你的计算逻辑# 例如:input$param1 + input$param2 }) output$result <- renderPrint({ cat("计算结果:", result()) })}shinyApp(ui, server)
替换计算逻辑,就能快速创建各种专业计算器。
5、分享你的应用
5.1 最简单的分享:ShinyApps.io
想让别人也能用你的应用?使用免费托管服务:
install.packages('rsconnect')rsconnect::setAccountInfo(...) # 按网站提示填写rsconnect::deployApp()
免费账号每月有25小时运行时间,个人使用完全足够。
5.2 局域网分享
如果只在办公室或家里分享:
# 运行应用时指定IPrunApp("app.R", host = "0.0.0.0", port = 3838)
告诉同事你的电脑IP(如192.168.1.100),他们就能在浏览器访问:
http://192.168.1.100:3838
5.3 打包发送
如果对方也有R环境:
结语
学习Shiny,不仅仅是学一个新技术,更是思维方式的升级:
从写代码给自己用,到做工具给别人用代码的价值在于分享,工具的价值在于使用。
从一次性分析,到可重复服务一个好的Shiny应用,能服务成千上万次请求。
从技术实现,到用户体验不仅要考虑代码怎么写,还要考虑用户怎么用。
最重要的是,Shiny让你看到了R语言的另一面:它不只是分析工具,更是创造工具的工具。
你的第一个Shiny应用可能很简单,但当你看到别人使用它时,那种"我创造了这个"的成就感,是单纯写脚本无法比拟的。
准备好创建第一个Shiny应用了吗?
扫描下方二维码,添加微信(H_Z240715),备注【Shiny起步】,获取: