0

I'm trying to create a shiny module that adjusts a text output based on a date input.

I used a similar question to outline my issue. When I debug I see that val_from_date() is NULL, which then throws an error when I try to filter my dataset on that object.

library(shiny)

# sample data

date_range <- seq(as.Date("2020-03-01"), Sys.Date()-1, by = "day")

dataset <- tibble(date = date_range,
                  n = runif(length(date_range)))

# modules

dateRangeUI <- function(id) {
  
  ns <- NS(id)
  
  tagList(
    uiOutput(ns("from_date")),
    uiOutput(ns("to_date"))
    
  )
}

dateRangeServer <- function(id) {
  
  moduleServer(id,
               
               function(input, output, session) {
                 
                 output$from_date = renderUI({dateInput(
                   session$ns("from_date_select"),
                   "From",
                   value = Sys.Date() - 30,
                   min = as_date('2020-03-01'),
                   max = Sys.Date()
                 )})
                 
                 output$to_date = renderUI({dateInput(
                   session$ns("to_date_select"),
                   "To",
                   value = Sys.Date()-1,
                   min = as_date('2020-03-01'),
                   max = Sys.Date()-1)})
                 
                 return(list(
                   val_from_date = reactive({input$from_date_select}),
                   val_to_date = reactive({input$to_date_select})
                 ))
                 
               })
}

# ui, server, app

ui <- fluidPage(
  dateRangeUI("daterange"),
  textOutput("average_data")
)

server <- function(input, output, session) {
  daterange <- dateRangeServer("daterange")
  output$average_data <- renderText({
    dataset %>%
    filter(date >= daterange$val_from_date()) %>%
    filter(date <= daterange$val_to_date()) %>%
    summarise(mean(n))
  })
}

shinyApp(ui = ui, server = server)
D.sen
  • 938
  • 5
  • 14

1 Answers1

1

2 Issues:

  • daterange$val_from_date()/daterange$val_to_date() is NULL in the beginning -> use req
  • renderText can't deal with dplyr output -> use renderPrint & verbatimTextOutput instead
ui <- fluidPage(
  dateRangeUI("daterange"),
  verbatimTextOutput("average_data")
)

server <- function(input, output, session) {
  daterange <- dateRangeServer("daterange")
  output$average_data <- renderPrint({
    req(daterange$val_from_date(),
        daterange$val_to_date())
    dataset %>%
      filter(date >= daterange$val_from_date()) %>%
      filter(date <= daterange$val_to_date()) %>%
      summarise(mean(n))
  })
}
starja
  • 9,887
  • 1
  • 13
  • 28