R语言中的shiny框架
- [Shiny 的基本概念](#Shiny 的基本概念)
- 基本用法示例
- 常见用法示例
-
- [1. 输入控件](#1. 输入控件)
- [2. 输出控件](#2. 输出控件)
- [3. 动态 UI](#3. 动态 UI)
- [4. 数据传递和反应式编程](#4. 数据传递和反应式编程)
- 高级功能
-
- [1. 使用 shinyjs](#1. 使用 shinyjs)
- [2. 使用 shinythemes](#2. 使用 shinythemes)
Shiny 是一个 R 语言的框架,用于构建交互式的网页应用,可以让用户以最少的 HTML、CSS 和 JavaScript 代码开发动态的Web 应用程序,Shiny 主要优点是能够将 R 的分析和可视化能力直接嵌入到 Web应用中,从而使数据分析变得更直观和易于交互,通过结合 UI设计和服务器逻辑,可创建各种功能丰富的应用,包括数据可视化、动态输入和响应式编程等
Shiny 的基本概念
Shiny 应用程序主要由两个部分组成:
1. UI(用户界面): 定义应用的布局和外观
2. Server(服务器逻辑): 定义应用的逻辑和数据处理
基本用法示例
r
library(shiny)
# Define UI
ui <- fluidPage(
titlePanel("Hello Shiny!"),
sidebarLayout(
sidebarPanel(
sliderInput("num", "选择一个数字", 1, 100, 50)
),
mainPanel(
textOutput("value")
)
)
)
# Define server logic
server <- function(input, output) {
output$value <- renderText({
paste("你选择的数字是", input$num)
})
}
# Run the application
shinyApp(ui = ui, server = server)
效果
常见用法示例
1. 输入控件
Shiny 提供了多种输入控件,包括:
- textInput()
- numericInput()
- sliderInput()
- selectInput()
- checkboxInput()
- radioButtons()
示例:滑块和文本输入
r
library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("slider", "选择一个值:", min = 1, max = 100, value = 50),
textInput("text", "输入文本:", "默认文本")
),
mainPanel(
textOutput("sliderValue"),
textOutput("textValue")
)
)
)
server <- function(input, output) {
output$sliderValue <- renderText({
paste("滑块的值是:", input$slider)
})
output$textValue <- renderText({
paste("输入的文本是:", input$text)
})
}
shinyApp(ui = ui, server = server)
效果
2. 输出控件
Shiny 提供了多种输出控件,用于展示数据和图表,包括:
- textOutput()
- verbatimTextOutput()
- plotOutput()
- tableOutput()
- imageOutput()
示例:绘制图表
r
library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("num", "选择一个数字:", min = 1, max = 100, value = 50)
),
mainPanel(
plotOutput("histPlot")
)
)
)
server <- function(input, output) {
output$histPlot <- renderPlot({
hist(rnorm(input$num), main = "随机数的直方图", xlab = "值", ylab = "频率")
})
}
shinyApp(ui = ui, server = server)
效果
3. 动态 UI
有时需要根据输入动态生成 UI 组件,这可以使用 uiOutput() 和 renderUI() 来实现
示例:动态生成文本输入框
r
library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
numericInput("numInputs", "选择文本框数量:", 1, min = 1, max = 10),
uiOutput("dynamicInputs")
),
mainPanel(
verbatimTextOutput("values")
)
)
)
server <- function(input, output, session) {
output$dynamicInputs <- renderUI({
n <- input$numInputs
lapply(1:n, function(i) {
textInput(paste0("text", i), paste("文本框", i))
})
})
output$values <- renderPrint({
inputs <- sapply(1:input$numInputs, function(i) {
input[[paste0("text", i)]]
})
inputs
})
}
shinyApp(ui = ui, server = server)
效果
4. 数据传递和反应式编程
Shiny 使用反应式编程模型来处理数据的动态变化。使用 reactive() 和 reactiveVal() 可以创建反应式值和表达式
示例:反应式表达式
r
library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("num", "选择一个数字:", min = 1, max = 100, value = 50)
),
mainPanel(
textOutput("sumValue")
)
)
)
server <- function(input, output) {
reactiveSum <- reactive({
input$num + 10
})
output$sumValue <- renderText({
paste("数字加10的结果是:", reactiveSum())
})
}
shinyApp(ui = ui, server = server)
效果
高级功能
1. 使用 shinyjs
shinyjs 可用来增强 Shiny 应用的功能,比如隐藏和显示 UI 元素、执行 JavaScript 代码等
r
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(), # 使 shinyjs 可用
actionButton("toggle", "切换文本框"),
textInput("txt", "文本框", "初始值")
)
server <- function(input, output) {
observeEvent(input$toggle, {
toggle("txt") # 切换文本框的显示和隐藏
})
}
shinyApp(ui = ui, server = server)
效果
2. 使用 shinythemes
shinythemes 提供了多种预设的主题,可以用来美化 Shiny 应用的界面
r
library(shiny)
library(shinythemes)
ui <- fluidPage(
theme = shinytheme("darkly"), # 使用 darkly 主题
titlePanel("Shiny 应用的主题"),
sidebarLayout(
sidebarPanel(
sliderInput("num", "选择一个数字:", min = 1, max = 100, value = 50)
),
mainPanel(
textOutput("value")
)
)
)
server <- function(input, output) {
output$value <- renderText({
paste("你选择的数字是", input$num)
})
}
shinyApp(ui = ui, server = server)
效果