2016-09-26 3 views
0

Ich benutze glänzende App, um einige Prognose-Grafiken zu machen. Allerdings habe ich ein Problem, dass die App nur einige Grafiken zeigt. Ich verwende derzeit den folgenden Code für den Server Teil der App.Shiny App, nur einige Grafiken zeigen

server <- function(input, output) { 

output$graph <- renderPlot({ 
     row.number <- which(grepl(input$n1, Data$Kontotal)) 
     name <- Data [row.number, -(1:3)] 
     name <- t(name) 
     name <- ts(name, frequency=12, start=c(2007,1)) 
     n.row <- nrow(name) 

     en<-max(time(name)) 
     ds<-as.data.frame(window(name,end=en)) 
     names(ds)<-'obs' 
     ds$date<-as.Date(time(window(name,end=en)))  


     p1a <- ggplot(data=ds,aes(x=date,y=obs)) 
     p1a <- p1a+geom_line(col='red') 
     p1a <- p1a+scale_x_date(name='',breaks='1 year',minor_breaks='1 month',labels=date_format("%b-%y"),expand=c(0,0)) 
     p1a <- p1a+scale_y_continuous(name='mio.kr') 
     p1a <- p1a + theme_bw() + 
      theme(panel.border = element_blank(), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black")) }) 


output$graph2 <- renderPlot({ 

    if (input$n3 == "HW") { 
      row.number <- which(grepl(input$n1, Data$Kontotal)) 
      name <- Data [row.number, -(1:3)] 
      name <- t(name) 
      name <- ts(name, frequency=12, start=c(2007,1)) 
      n.row <- nrow(name) 


      fit <- auto.arima (name) 
      fcast <- forecast(fit, input$n2) 



      ### Plotting 

      data.pred <- forc.ggplot (name, fcast) 




      p1a <- ggplot(data=data.pred,aes(x=date,y=obs)) 
      p1a <- p1a+geom_line(col='red') 
      p1a <- p1a+geom_line(aes(y=fitted),col='blue') 
      p1a <- p1a+geom_line(aes(y=forecast))+geom_ribbon(aes(ymin=lo95,ymax=hi95),alpha=.25) 
      p1a <- p1a+scale_x_date(name='',breaks='1 year',minor_breaks='1 month',labels=date_format("%b-%y"),expand=c(0,0)) 
      p1a <- p1a+scale_y_continuous(name='mio.kr') 
      p1a <- p1a + theme_bw() + 
       theme(panel.border = element_blank(), 
         panel.grid.major = element_blank(), 
         panel.grid.minor = element_blank(), 
         axis.line = element_line(colour = "black")) 
      p1a 


     } 

    if (input$n3 == "arima") { 
     row.number <- which(grepl(input$n1, Data$Kontotal)) 
     name <- Data [row.number, -(1:3)] 
     name <- t(name) 
     name <- ts(name, frequency=12, start=c(2007,1)) 
     n.row <- nrow(name) 


     fit <- auto.arima (name) 
     fcast <- forecast(fit, input$n2) 



     ### Plotting 

     data.pred <- forc.ggplot (name, fcast) 




     p1a <- ggplot(data=data.pred,aes(x=date,y=obs)) 
     p1a <- p1a+geom_line(col='red') 
     p1a <- p1a+geom_line(aes(y=fitted),col='blue') 
     p1a <- p1a+geom_line(aes(y=forecast))+geom_ribbon(aes(ymin=lo95,ymax=hi95),alpha=.25) 
     p1a <- p1a+scale_x_date(name='',breaks='1 year',minor_breaks='1 month',labels=date_format("%b-%y"),expand=c(0,0)) 
     p1a <- p1a+scale_y_continuous(name='mio.kr') 
     p1a <- p1a + theme_bw() + 
      theme(panel.border = element_blank(), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black")) 
     p1a 


    } 


}) 

}

Das Problem ist, dass nur die ARIMA Graph ist. Beachten Sie jedoch, dass in dem hier veröffentlichten Code habe ich das Modell in der HW-Teil des Codes geändert, so ist es identisch mit dem Teil ARIMA (einschließlich des Modells), nur um zu überprüfen, dass es weil etwas nicht stimmte die ets-Funktion (mit der ich das HW-Modell abgeschätzt habe).

Es bleibt einfach eine Leerstelle, wo das Diagramm im Falle von HW hätte sein sollen, aber das rechte Diagramm für das ARIMA-Modell.

Wer hat etwas ähnliches versucht?

+2

bitte posten Sie die 'ui.r' –

Antwort

0

Setzen Sie p1a am Ende Ihrer renderPlot() Chunk außerhalb der if Blöcke. renderPlot versucht, den letzten Ausdruck der Chunks darzustellen. Im Fall von input$n3 =="HW" generieren Sie Ihr Plot-Objekt p1a, aber fahren fort, die nächste if Bedingung auszuwerten, die FALSE ist, und somit wird nichts an plotOutput() übergeben. Eine alternative Lösung würde switch() anstelle if verwenden. switch() wertet nur den Ausdruck des übereinstimmenden Elements aus.