【问题标题】:R Shiny One actionButton for multiple OutputR Shiny One actionButton 用于多个输出
【发布时间】:2021-07-28 03:57:12
【问题描述】:

单击操作按钮后,我试图在 Shiny mainPanel 上分别显示两个表(dt2 和 dt3)。 dt2 涉及所选类型(mpg 数据集)的前五辆汽车,而 dt3 计算所选年份的平均 cty。不幸的是,它不起作用,因为我只有这张小桌子:

如何在主面板上分别显示两个表格? (例如左侧为 dt2,右侧为 dt3)

注意:dt2 和 dt3 在某种意义上是相关的,即 dt3 派生自 dt2

UI 方面:

library(shiny)
    shinyUI(fluidPage(
        sidebarLayout(
            sidebarPanel(
    
              selectInput("manufacturer", "Car Type:", c("audi","chevrolet")),
              selectInput("year", "Year:", c("1999","2008")),
              actionButton("action", "Go!")
                         ),
    
            mainPanel(tableOutput("cty_mean")) 
                     ) 
                     ))

服务器端:

shinyServer(function(input, output) {

  mydata <- eventReactive(input$action, {  
    
     library(ggplot2)
     library(dplyr)
    
     dt <- mpg
     dt2 <- dt %>% 
       filter(manufacturer==input$manufacturer) %>% 
       mutate(mean = mean(cty)) %>% slice(1:5)
     dt2
    
     dt3 <- dt2 %>% group_by(input$year) %>% 
       summarise(mean = mean(cty))
     dt3

    })
   
   output$cty_mean <- renderTable({       mydata()           })


})

【问题讨论】:

  • 我认为您可能希望您的第二个 dt3 表达式如下:dt3 &lt;- dt2 %&gt;% group_by(year) %&gt;% filter(year == input$year) %&gt;% summarise(mean = mean(cty))。当您将input$year 之类的输入传递给group_by() 时,您实际上是在制作整个数据集的一组。

标签: r shiny


【解决方案1】:

在您的代码中,mydata() 是一个响应式函数,其输出为 dt3(函数的最后一行),这就是为什么您只能得到一个表作为结果。

您可以将reactiveValuesobserveEvent 结合使用:

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

ui <-shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      
      selectInput("manufacturer", "Car Type:", c("audi","chevrolet")),
      selectInput("year", "Year:", c("1999","2008")),
      actionButton("action", "Go!")
    ),
    
    mainPanel(tableOutput("dt2"),
              tableOutput("dt3")) 
  ) 
))


server <-shinyServer(function(input, output) {
  
  mydata <- reactiveValues()
  
  observeEvent(input$action, {  
    dt <- mpg
    mydata$dt2 <- dt %>% 
      filter(manufacturer==input$manufacturer) %>% 
      mutate(mean = mean(cty)) %>% slice(1:5)
    
    mydata$dt3 <- mydata$dt2 %>% group_by(input$year) %>% 
      summarise(mean = mean(cty))
  })
  
  output$dt2 <- renderTable({       mydata$dt2           })
  output$dt3 <- renderTable({       mydata$dt3           })
  
})

shinyApp(ui,server) 

【讨论】:

    【解决方案2】:

    我会将mydata() 拆分为两个不同的反应事件:

    library(shiny)
    shinyUI(fluidPage(
        sidebarLayout(
            sidebarPanel(
                selectInput("manufacturer", "Car Type:", c("audi","chevrolet")),
                selectInput("year", "Year:", c("1999","2008")),
                actionButton("action", "Go!")
            ),
            mainPanel(tableOutput("cty_mean1"),
                      tableOutput("cty_mean2")) 
        ) 
    ))
    
    shinyServer(function(input, output) {
            
            library(ggplot2)
            library(dplyr)
            
            mydata1 <- eventReactive(input$action, {  
                dt <- mpg
                dt2 <- dt %>% 
                    dplyr::filter(manufacturer==input$manufacturer) %>% 
                    dplyr::mutate(mean = mean(cty)) %>% slice(1:5)
                dt2
            })
            
            mydata2 <- eventReactive(input$action, {  
                dt3 <- mydata1() %>% group_by(input$year) %>% 
                    summarise(mean = mean(cty))
                dt3
            })
    
            output$cty_mean1 <- renderTable({       mydata1()           })
            output$cty_mean2 <- renderTable({       mydata2()           })
        })
    

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 2020-10-22
      • 2021-03-30
      • 1970-01-01
      • 2021-11-28
      • 2018-03-23
      相关资源
      最近更新 更多