【问题标题】:updating of Shiny tabs更新闪亮的标签
【发布时间】:2019-11-11 22:49:36
【问题描述】:

我正在尝试构建一个带有多个选项卡的 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。谁能给我一个提示,说明我上面的假设是如何错误的,或者指出更新基础数据集的更聪明的方法?简单的解释最有帮助(我没有技术背景)。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    output$barChart 是一个响应式端点。修改代码的最简单方法是让它直接使用响应式源 input$selectData。每当输入更改时,您的输出将被通知它需要重新执行。

    看起来像这样:

    output$barChart <- renderPlot({
    
        if (input$selectData == "ABCD"){
          usedDataFrame <- dataFrameA
        }else{
          usedDataFrame <- dataFrameB
        }
    
        ggplot(data = usedDataFrame, aes(x = company, y = revenue)) +
          geom_bar(width = 1, stat = "identity")
    })
    

    你根本不需要observeEvent

    另一种方法是,您可以让usedDataFrame 响应式,然后从您的renderPlot 拨打电话:

    usedDataFrame <- reactive({
      if (input$selectData == "ABCD"){
        dataFrameA
      }else{
        dataFrameB
      }
    })
    
    output$barChart <- renderPlot({
      ggplot(data = usedDataFrame(), aes(x = company, y = revenue)) +
        geom_bar(width = 1, stat = "identity")
    })
    

    【讨论】:

      【解决方案2】:

      您非常接近您的方法,但是比处理全局变量更简单的方法可以使用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)
      

      【讨论】:

        猜你喜欢
        • 2016-02-20
        • 1970-01-01
        • 2015-11-19
        • 2018-03-03
        • 2019-02-22
        • 1970-01-01
        • 2016-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多