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)

效果

相关推荐
zhangrelay10 分钟前
机器人相关知识的本身和价值
笔记·学习·持续学习
发光的小豆芽13 分钟前
TMStarget学习——Functional Connectivity
学习·matlab
yunson_Liu22 分钟前
编写Python脚本在证书过期10天内将域名信息发送到钉钉
开发语言·python·钉钉
脚步的影子35 分钟前
R语言的基础知识R语言函数总结
开发语言·r语言
Evand J39 分钟前
卡尔曼滤波中Q和R与噪声的关系
开发语言·r语言
脚步的影子1 小时前
.net core8 使用JWT鉴权(附当前源码)
java·开发语言·.netcore
void10241 小时前
python画图1
开发语言·python
为暗香来1 小时前
MySQL学习(索引)
数据库·学习·mysql
LL.CS1 小时前
TypeScript学习笔记
笔记·学习·typescript
就叫飞六吧1 小时前
GO主流开源框架
开发语言·golang·开源