首页 > 解决方案 > 更新闪亮的标签

问题描述

我正在尝试构建一个带有多个选项卡的 Shiny 应用程序。其中一个选项卡供用户选择基础数据集,我希望这些数据以漂亮的图表显示在另一个选项卡中。(我将基础数据保存在最大大小的文件中,用户可以一次调查一个,因为我担心否则 Shiny 应用程序可能会变得难以忍受甚至崩溃)。但是,我正在努力更新保存基础数据的变量,如下面的简化的可重现示例所示:

library(shiny)
library(shinyWidgets)
library(dplyr)
library(ggplot2)

dataFrameA <- data.frame(
  company = c("A", "B", "C", "D"), 
  revenue = runif(4, min = 0, max = 1000000)
)

dataFrameB <- data.frame(
  company = c("E", "F", "G", "H"), 
  revenue = runif(4, min = 0, max = 1000000)
)

usedDataFrame <- dataFrameA

ui <- fluidPage(
  verticalTabsetPanel(
    verticalTabPanel(
      title = "graph", icon = icon("chart-bar", "fa-1x", lib = "font-awesome"),
      box_height = "120px", 
      plotOutput(outputId = "barChart")
    ), 
    verticalTabPanel(
      title = "data", icon = icon("database", "fa-1x", lib = "font-awesome"),
      box_height = "120px", 
      selectInput(inputId = "selectData", label = "choose dataset", 
                  choices = c("ABCD", "EFGH"))
    )
  )
)

server <- function(input, output){

  output$barChart <- renderPlot({
    ggplot(data = usedDataFrame, aes(x = company, y = revenue)) +
      geom_bar(width = 1, stat = "identity")
  })

  observeEvent(input$selectData, {
    if (input$selectData == "ABCD"){
      usedDataFrame <- dataFrameA
    }else{
      usedDataFrame <- dataFrameB
    }
  })

}

shinyApp(ui = ui, server = server)

您会看到,尽管用户在“数据”选项卡中选择了不同的数据集,但“图表”选项卡中的图表不会改变。但是,我预计它会发生变化,因为下面的 observeEvent 块会更改图形所基于的全局变量 usedDataFrame。谁能给我一个提示,说明我上面的假设是如何错误的,或者指出更新基础数据集的更聪明的方法?简单的解释最有帮助(我没有技术背景)。

标签: rshiny

解决方案


您非常接近您的方法,但是比处理全局变量更简单的方法可以使用reactive它将根据您的input.

library(shiny)
library(shinyWidgets)
library(dplyr)
library(ggplot2)

dataFrameA <- data.frame(
  company = c("A", "B", "C", "D"), 
  revenue = runif(4, min = 0, max = 1000000)
)

dataFrameB <- data.frame(
  company = c("E", "F", "G", "H"), 
  revenue = runif(4, min = 0, max = 1000000)
)

ui <- fluidPage(
  verticalTabsetPanel(
    verticalTabPanel(
      title = "graph", icon = icon("chart-bar", "fa-1x", lib = "font-awesome"),
      box_height = "120px", 
      plotOutput(outputId = "barChart")
    ), 
    verticalTabPanel(
      title = "data", icon = icon("database", "fa-1x", lib = "font-awesome"),
      box_height = "120px", 
      selectInput(inputId = "selectData", label = "choose dataset", 
                  choices = c("ABCD", "EFGH"))
    )
  )
)

server <- function(input, output){

  dat <- reactive({
    if (input$selectData == "ABCD") {
      return(dataFrameA)
    }
    else if (input$selectData == "EFGH") {
      return(dataFrameB)
    }
  })

  output$barChart <- renderPlot({
    ggplot(data = dat(), aes(x = company, y = revenue)) +
      geom_bar(width = 1, stat = "identity")
  })

}

shinyApp(ui = ui, server = server)

推荐阅读