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)

>Solution :

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

Leave a Reply