📜  r lm 编写交互 (1)

📅  最后修改于: 2023-12-03 15:34:35.363000             🧑  作者: Mango

使用 R 语言编写交互式作品

在程序员的日常工作中,交互性的作品是非常有用且必要的。使用 R 语言编写交互式作品可以让程序员轻松地制作各种交互式的数据可视化,开发出前沿的数据探索工具,指导并展示其他人员的决策。

R Shiny

R Shiny是一个基于 R 语言的专业 web 应用程序框架,通过它,我们可以构建精美且交互性强的 web 应用程序。 Shiny 平台能够自动为用户构建一个由 R 语言驱动的、基于web的应用程序。使用 Shiny,程序员可以在创建 R Markdown 环境和交互式数据可视化的同时,将这些工作转换为 Web 应用程序。

ShinyApp 的结构

ShinyApp 分为两个部分:

  • UI 用户界面:由 HTML 模板构成,负责客户端的操作,可用 Shiny package 中有关于UI的函数来生成
  • Server 服务器端:由 R 代码构成,负责服务器的数据处理、传输等。

UI

用户界面(UI)是 Shiny 应用的前端界面,负责与用户交互的部分。UI交互界面可以是HTML网页,也可以包括许多自然语言描述、图片、图表等等。使用 Shiny package 来构建自己的用户界面,开发跨平台交互 Web 应用。

# Example: 修改 UI 的标题,输出3个选项按钮和柱状图形, 如下图
#
# +-----+-----+
# |  o  |  o  |
# +-----+-----+
# |  o  |  o  |
# +-----+-----+
# |  o  |  o  |
# +-----+-----+
# |/////////////|
# +-------------+

library(shiny)

# 定义用户交互界面
ui <- fluidPage(
  # 页面主标题
  titlePanel("3x2 Button Grid"),
  # 页面副标题,H4 ~ H6 序号依次递减
  sidebarLayout(
    sidebarPanel(
      h4("Options"),
      # 输出3个选项按钮
      checkboxGroupInput(
        inputId = "option",
        label = "Choose Three Numbers:",
        choices = c(1, 2, 3, 4, 5, 6)
      )
    ),
    mainPanel(
      h4("Distribution of Selected Numbers"),
      # 输出柱状图
      plotOutput(outputId = "hist")
    )
  )
)

# 定义柱状图输出
server <- function(input, output) {
  output$hist <- renderPlot({
    req(input$option)
    hist(input$option, main = "Distribution of Selected Numbers", col = "skyblue", border = "white")
  })
}

# 将用户交互界面与输出结合起来,并开始运行 ShinyApp
shinyApp(ui = ui, server = server)

image

Server

在开发 Shiny 应用程序时, 服务器端(server)通常与客户端(UI)存在交互。例如,当用户单击按钮或更改数据时,需要在服务器端更新数据或执行一些操作,以进行动态信息交互。Shiny 应用程序可以通过 reactivity(响应式)概念使用简单的 R 代码实现这些交互。

使用 Shiny 开发服务器端时,需要理解下面两个内容:

  1. 所需的数据
  2. 所需的代码
# Example: 点任意位置,空白区域显示数据点数,将鼠标指针悬停在数据点上显示数据点的值。

library(shiny)
library(ggplot2)
library(DT)

ui <- fluidPage(
  titlePanel("An Introduction to Shiny"),
  sidebarLayout(
    sidebarPanel(),
    mainPanel(
      plotOutput(outputId = "plot1"),
      br(),
      DTOutput(outputId = "table1")
    )
  )
)

server <- function(input, output, session) {

  # Define the dataset
  set.seed(122)
  data <- data.frame(x = rnorm(100), y = rnorm(100))

  # Define the reactive values
  rv <- reactiveValues(points = 0L, data = data)

  # Render the scatterplot
  output$plot1 <- renderPlot({
    ggplot(rv$data, aes(x = x, y = y)) +
      geom_point() +
      annotate("text", x = -1, y = -1, label = paste(rv$points, "points"))
  })

  # Render the datatable showing the data
  output$table1 <- renderDT({
    DT::datatable(rv$data, options = list(pageLength = 25))
  })

  # Count the number of points and update the diagram
  observeEvent(input$plot1_click, {
    rv$points <- rv$points + 1L
    nearest_point <- ggplot2::nearPoints(rv$data, input$plot1_click)
    rv$data <- rv$data[-nearest_point$index, ]
  })

}

shinyApp(ui, server)

运行上述代码,点击任意位置可观察点数的变化,将鼠标指针悬停在数据点上可查看数据价值。

image

总结

Shiny 平台的开发十分简单!尤其适合用来构建数据直观性的可视化应用程序、快速展示数据及自定义构建数据交互工具。我们可以让数据产品更加生动有趣。