0

I have been trying to make an app using R Shiny modules. This is what the module looks like.

library(shiny)
library(dplyr)
library(tidyr)
library(plotly)
library(shinycssloaders)
library(lubridate)
library(shinyWidgets)


graphModuleUI <- function(id, itemlist) {
  ns <- NS(id)
  
  tagList(
    sidebarLayout(
      sidebarPanel(
        dateRangeInput( ns("daterange"), " Select Date Range",
                        min = min(dat$Date),
                        max = max(dat$Date),
                        start = max(dat$Date) - days(30),
                        end = max(dat$Date)),
        
        pickerInput(ns("location"),"Select Location", 
                    choices= unique(dat$location), 
                    options = list(`actions-box` = TRUE),multiple = T,
                    selected = unique(dat$location)),
        
        selectInput(ns("items"), "Select Items", choices = itemlist,
                    selected = itemlist, multiple= T)
      ),
      
      mainPanel(
        withSpinner(plotlyOutput("plot"))
      )
      
    )

    
  )
}
graphModule <- function(input, output, session, data) {
  

  df <- reactive({
    data%>%
      filter(Date <= input$daterange[2], Date >= input$daterange[1])%>%
      filter(location %in% input$location)%>%
      filter(item %in% input$items)%>%
      group_by(Date)%>%
      summarise(avgprice=mean(price))%>%
      mutate(pricelag=lag(avgprice,1))%>%
      mutate(percent_change=(avgprice-pricelag)/pricelag)

  })
  
  
  output$plot<- renderPlotly({
    df()%>%
      plot_ly(x=~Date, y=~percent_change, type = 'scatter', mode='lines')%>%
      layout(yaxis=list(title="Daily change in %"), 
             title= paste("Daily change in average price of", input$categories ,"items", sep = " "),
             paper_bgcolor='transparent',
             plot_bgcolor='transparent')
  })
}

The data is as follows

dat<-read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vTiN0zQUwFH4neKMbsxBJOpv0Q_OPZkI5mUZXtf45O9mEM_brIFVGPWoXkoNRrzNSKakOsNXO9bdOwO/pub?output=csv")
dat$shop<-as.factor(dat$shop)
dat$category<-as.factor(dat$category)
dat$location<-as.factor(dat$location)
dat$Date<-ymd(dat$Date)


groceries_data <- filter(dat, category == "Groceries")
eat_out_data <- filter(dat, category == "Eating_Out")
wearables_data <- filter(dat, category == "Wearables")
space_data <- filter(dat, category == "Space")
utilities_data <- filter(dat, category == "Utilities")
transport_data <- filter(dat, category == "Transport")

all_data_items<-unique(dat$item)
groceries_data_items<-unique(groceries_data$item)
eat_out_data_items<-unique(eat_out_data$item)
wearables_data_items<-unique(wearables_data$item)
space_data_items<-unique(space_data$item)
utilities_data_items<-unique(utilities_data$item)
transport_data_items<-unique(transport_data$item)

And the app looks like this.

ui <- fluidPage(
  titlePanel("PriceTrack"),
  tabsetPanel(id = "Prices", 
              tabPanel("All", graphModuleUI("all", all_data_items)),
              tabPanel("Groceries", graphModuleUI("groceries", groceries_data_items)),
              tabPanel("Eating Out", graphModuleUI("eating_out", eat_out_data_items)),
              tabPanel("Wearables", graphModuleUI("wearables", wearables_data_items)),
              tabPanel("Space", graphModuleUI("space", space_data_items)),
              tabPanel("Utilities", graphModuleUI("utilities", utilities_data_items)),
              tabPanel("Transport", graphModuleUI("transport", transport_data_items))
  )
)
server <- function(input, output, session) {
  callModule(graphModule, "all", dat)
  callModule(graphModule, "groceries", groceries_data)
  callModule(graphModule, "eating_out", eat_out_data)
  callModule(graphModule, "wearables", wearables_data)
  callModule(graphModule, "space", space_data)
  callModule(graphModule, "utilities", utilities_data)
  callModule(graphModule, "transport", transport_data)
}
# Run the application 
shinyApp(ui = ui, server = server)

The modular UI (inputs) work fine. But the plot never renders from the modular server.

I am unable to understand why. It doesn't show any error. Just, the 'spinner' spins for unlimited amount of time.

Can anyone please help me resolve this issue? Thanks in advance.

Ronak Shah
  • 377,200
  • 20
  • 156
  • 213
Asitav Sen
  • 56
  • 4

0 Answers0