Search code examples
rplotshinyforecasting

Shiny input plot selection


I have this code and I want to have a Select Input option to select from two different ways of plotting the graphic.

I want that if you choose the "level" option "fit 2" gets plotted instead of just fit.

this is fit2.

plot(forecast(fit2,



    #Confidence Interval %

              level = c(70,90)),
 sub= "Confidence Interval 70% ~ 90%
     or Determined by user",
 ylab= "Y Axis Variable",

 main= "Forecast Linear Structural Model @ Level-Wise",

     ylim = c(0,400))

This is the Shiny code.

library(forecast)
library(shiny)
timese <- ts(WWWusage, start= c(2008,1), end= c(2016,1), frequency=12)
fit <- StructTS(timese,"trend")
fit2 <- StructTS(timese,"level")




   ui <- fluidPage(
  (titlePanel("app | Forecast Models", windowTitle = "app")),


  #Select input
  selectInput(inputId = "select", label = "Select Forecast",
              choices = c("Trend","Level"),

                     plotOutput(outputId = "hist")),

 #Range Input

  sliderInput(inputId = "range",
              label = "Set Confidence Interval. Up to 99%",
              min = 0,max = 99, value = c(60,90)),

  mainPanel(plotOutput(outputId = "plot"))

)



server <- function(input, output) {

  output$plot <- renderPlot({

    plot(forecast(fit, #Confidence Interval %
                  level = c(input$range)),
         sub= "Confidence Interval 70% ~ 90% or Determined by user", 
         ylab= "Y Axis Variable",
         main= "Forecast Linear Structural Model @ Trend-Wise",
         ylim = c(0,400))
  })

}

shinyApp(ui, server)

Solution

  • Like

    server <- function(input, output) {
    
        output$plot <- renderPlot({
            if(input$select=="Trend")
                plot(forecast(fit, #Confidence Interval %
                              level = c(input$range)),
                     sub= "Confidence Interval 70% ~ 90% or Determined by user", 
                     ylab= "Y Axis Variable",
                     main= "Forecast Linear Structural Model @ Trend-Wise",
                     ylim = c(0,400))
            else
                plot(forecast(fit2,
                              #Confidence Interval %
                              level = c(70,90)),
                     sub= "Confidence Interval 70% ~ 90% or Determined by user",
                     ylab= "Y Axis Variable",
                     main= "Forecast Linear Structural Model @ Level-Wise",
                     ylim = c(0,400))
        })
    
    }
    

    Basically you'd decide based on the input$select what to plot inside render plot.

    A slightly more elegant version would be.

    server <- function(input, output) {
    
        output$plot <- renderPlot({
            if(input$select=="Trend")
                method <- fit
            else 
                method <- fit2
            plot(forecast(method, #Confidence Interval %
                          level = c(input$range)),
                 sub= "Confidence Interval 70% ~ 90% or Determined by user", 
                 ylab= "Y Axis Variable",
                 main= "Forecast Linear Structural Model @ Trend-Wise",
                 ylim = c(0,400))
    
        })
    
    }
    

    However, this makes the two plot "more similar". As you can see in title. So you would need to define additional vars in the if. This comes down to a trade off