Код RStudio-Shiny работает построчно (Ctrl + Enter), но не с кнопкой «Запустить приложение» - PullRequest
0 голосов
/ 21 мая 2019

в RStudio приведенный ниже блестящий код работает нормально, если я запускаю его с помощью Ctrl + Enter, строка за строкой. Однако, если я запускаю весь код с помощью кнопки «Запустить приложение», он генерирует эту ошибку:

Ошибка в ts (x): объект 'ts' должен иметь одно или несколько наблюдений

Я думаю, что это из-за параметра "лямбда", но я не могу понять, почему. Любая помощь приветствуется.

Ссылка для "data.csv": https://www.dropbox.com/s/p1bhacdg8j1qx42/data.csv?dl=0

====================================

library(shiny)
library(shinydashboard)
library(plotly)
library(forecast)

df <- read.csv("data.csv")
demand <- ts(df$demand, start = c(1995, 1), frequency = 12)

lbd <- BoxCox.lambda(demand, lower=-5, upper=5)
m <- ar(BoxCox(demand,lambda=lbd))
fit_BC <- forecast(m, h=12, lambda=lbd)

ui <- dashboardPage(
  dashboardHeader(title = "Plot"),
  dashboardSidebar(disable = TRUE),
  dashboardBody(fluidRow(column(width = 12, box(plotlyOutput("forecast_plots"),width = NULL))))
)

server <- function(input, output) {
  output$forecast_plots <- renderPlotly({
    autoplot(fit_BC)
  })
}

shinyApp(ui, server)

==================================

1 Ответ

0 голосов
/ 22 мая 2019

autoplot () возвращает объект ggplot. Но для вашего вывода $ forecast_plots требуется объект plotly (с функцией plotlyOutput ()).

Рабочий код выглядит следующим образом:

ui <- dashboardPage(
    dashboardHeader(title = "Plot"),
    dashboardSidebar(disable = TRUE),
    dashboardBody(fluidRow(column(width = 12, box(plotOutput("forecast_plots"),width = NULL))))
)

server <- function(input, output) {
    output$forecast_plots <- renderPlot({
        autoplot(fit_BC)
    })
}

Объекты ggplot могут быть легко конвертированы с помощью функции ggplotly, но, к сожалению, преобразованный график с автоплотированием на графике теряет область прогнозирования. Вы можете проверить это как:

ui <- dashboardPage(
    dashboardHeader(title = "Plot"),
    dashboardSidebar(disable = TRUE),
    dashboardBody(fluidRow(column(width = 12, box(plotlyOutput("forecast_plots"),width = NULL))))
)

server <- function(input, output) {
    output$forecast_plots <- renderPlotly({
        ggplotly(autoplot(fit_BC))
    })
}

Добавить

Я нашел библиотеку автоплоттинга. https://terrytangyuan.github.io/2018/02/12/autoplotly-intro/

Функция autoplotly () может преобразовать объект autoplot в объект заговора, что примерно правильно.

library(shiny)
library(shinydashboard)
library(plotly)
library(forecast)
library(autoplotly)

df <- read.csv("c:/Users/010170283/Downloads/data.csv")
demand <- ts(df$demand, start = c(1995, 1), frequency = 12)

lbd <- BoxCox.lambda(demand, lower=-5, upper=5)
m <- ar(BoxCox(demand,lambda=lbd))
fit_BC <- forecast(m, h=12, lambda=lbd)

ui <- dashboardPage(
    dashboardHeader(title = "Plot"),
    dashboardSidebar(disable = TRUE),
    dashboardBody(fluidRow(column(width = 12, box(plotlyOutput("forecast_plots"),width = NULL))))
)

server <- function(input, output) {
    output$forecast_plots <- renderPlotly({
        autoplotly(autoplot(fit_BC))
    })
}

shinyApp(ui, server)

С его помощью можно увидеть область прогноза, и значения hi / lo 80% -ой границы представлены событием наведения мыши.

enter image description here

...