简体   繁体   中英

Pass the choices from selectInput on server side inside group_by function in Shiny app

I would like to pass the user selection to a group_by function in Shiny apps! The following code does not work, since the input$bearkdown is considered as a character!

How I could fix that?

dat = structure(list(year = c(2000, 2000, 2000, 2000, 2000, 2000, 2000, 
    2000, 2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001, 2001, 2001, 
    2001, 2001), month = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
    1, 2, 3, 4, 5, 6, 7, 8), Quarter = c(1L, 1L, 1L, 2L, 2L, 2L, 
    3L, 3L, 3L, 4L, 4L, 4L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L), project = c("DKF", 
    "DKF", "DKF", "DKF", "DKF", "DKF", "DKF", "DKF", "DKF", "DKF", 
    "DKF", "DKF", "DKF", "DKF", "DKF", "DKF", "DKF", "DKF", "DKF", 
    "DKF"), value = c(135.172264747094, 128.304968251943, 124.552331218312, 
    72.9910740042406, 78.3565950925784, 93.7813954394283, 65.906459417623, 
    67.4455518391957, 100.287050913478, 96.6700531783534, 106.789122585464, 
    91.1228414774245, 88.8192557763821, 100.949844928465, 92.3481876481075, 
    82.5695257044659, 78.2314855696782, 58.656187528325, 59.863983014387, 
    91.5297764110538)), row.names = c(NA, 20L), class = "data.frame")




library(shiny)
library(dplyr)

ui <- fluidPage(


    sidebarLayout(
        sidebarPanel(
          selectInput(inputId = 'breakdown',
                      label = 'Breakdown',
                      choices = c("Yearly"="year","Quarterly"="Quarter","Monthly"="month"),selected="Monthly")
        ),

        mainPanel(
           DT::dataTableOutput("datTB")
        )
    )
)


server <- function(input, output) {

    output$datTB <- DT::renderDataTable({
      
      df <- dat%>%
        group_by(input$breakdown)%>%
        mutate(LongTermWI = mean(value,na.rm = T))
    })
}


shinyApp(ui = ui, server = server)

One option would be to use dplyr::across and a second option would be to use the .data pronoun from the rlang package:

Using across :

group_by(across(input$breakdown)))

Using .data :

group_by(.data[[input$breakdown]])

Example code using across :

library(shiny)
library(dplyr)

ui <- fluidPage(
  
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = 'breakdown',
                  label = 'Breakdown',
                  choices = c("Yearly"="year","Quarterly"="Quarter","Monthly"="month"),selected="Monthly")
    ),
    
    mainPanel(
      DT::dataTableOutput("datTB")
    )
  )
)


server <- function(input, output) {
  
  output$datTB <- DT::renderDataTable({
    
    df <- dat%>%
      group_by(across(input$breakdown)) %>%
      mutate(LongTermWI = mean(value,na.rm = T))
  })
}


shinyApp(ui = ui, server = server)
#> 
#> Listening on http://127.0.0.1:3069

There are a couple of problems with your renderDataTable in addition to the one you identify.

First, your version asigns the mutated table to an object but doesn't return it. Next, you use mutate rather than summairise .

I think this gets you close to what you want:

  output$datTB <- DT::renderDataTable({
    dat%>%
      group_by(!! as.symbol(input$breakdown))%>%
      summarise(LongTermWI = mean(value,na.rm = T))
  })

If you want to group by month or quarter within year, then you have a bit more work to do.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM