R语言中的shiny框架

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)

效果

相关推荐
蜗牛一步步往上爬1 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
楚山之石1 小时前
【JCO】mpMRI 先行替代 TURBT 初始分期:BladderPath 随机试验让 MIBC 患者提前 45 天得到正确治疗
人工智能·学习·mri·医学影像
张张123y3 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
Peter-OK4 小时前
PostgreSQL学习笔记(入门-进阶-精通说明)
笔记·学习·postgresql
承渊政道5 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
冻柠檬飞冰走茶6 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing036 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
橙橙笔记6 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
雪落漂泊6 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
成都蜀味缘餐饮技术培训学校6 小时前
手撕烤兔技术培训实战指南,秘制腌料配方比例与调制手法
大数据·经验分享·笔记·其他·微信公众平台