Shiny больше не принимает реактивную функцию для значения xreg

#r #shiny #arima #forecast

#r #блестящий #arima #прогноз

Вопрос:

Я работал над блестящим приложением, которое использует auto.arima() из пакета вместе с xreg параметром. По какой-то причине xreg функция (которая принимает фрейм данных или матрицу) перестала принимать выходные данные реактивной функции, которая является подмножеством фрейма данных. Обходной путь отстой, и поэтому я надеюсь, что кто-то знает хороший способ исправить это.

Shiny выдает эту ОШИБКУ:

xreg должен быть числовой матрицей или вектором

Я пробовал:

  • повторная установка: forecast, shiny, dplyr, завершение очистки наших R и Rstudio и повторная установка с нуля.
  • Я попытался откатить пакет прогнозов до сборки с 6 месяцев назад (когда это работало)
  • Я пытался откатить R до сборки с 6 месяцев назад (когда это работало)
  • Я пробовал использовать другие пакеты прогнозов; например, bsts, похоже, работает просто отлично

Это какой-то минимально жизнеспособный блестящий код. Создайте файл .csv с 3 столбцами данных, обязательно назовите столбцы, например y , x1 и x2 .

  library(shiny)
 library(forecast)
 library(dplyr)


 ui <- fluidPage(

 # Application title
 titlePanel("arima test"),

 # Sidebar with a slider input for number of bins 
 sidebarLayout(
    sidebarPanel(
     
    # Input: Select a file ----
    fileInput("uploaded_file", "Choose CSV File",
              multiple = TRUE,
              accept = c("text/csv",
                         "text/comma-separated-values,text/plain",
                         ".csv")),
    
    uiOutput("dv_dropdown"),
    uiOutput("iv_checkbox")
    
  ),
  
  # Show a plot of the generated distribution
  mainPanel(
    verbatimTextOutput("model"),
    tableOutput('data')
  )
  )
  )


 server <- function(input, output) {

 # Read .csv file ----
   df <- reactive({
   req(input$uploaded_file)
   read.csv(input$uploaded_file$datapath,
         header = TRUE)

   })

 # Dynamically generate a list of the dependent variables for the user to choose from the uploaded .csv ----
   output$dv_dropdown <- renderUI({

   selectInput(inputId = "select_dependents", 
            label = "dependent time series:", 
            choices = names(df()[,c(-1)])
            )
   })

 # Dynamically generate a list of the independent variables for the user to choose ----
   output$iv_checkbox <- renderUI({

   checkboxGroupInput(inputId = "select_ivs", 
                   label = "Select Independent variables:", 
                   choices = setdiff(names(df()[,c(-1)]), input$select_dependents),
                   selected = setdiff(names(df()), input$select_dependents))
    })


 ####### CREATE REACTIVE DATA OBJECTS BASED ON FILTERS #################

 # this creates a dataframe of the dependent time series
 df_sel <- reactive({
   req(input$select_dependents)
   df_sel <- df() %>% select(input$select_dependents)


 })

 # this creates a dataframe of the dependent time series
 df_indep <- reactive({
   req(input$select_ivs)
   df_indep <- df() %>% select(input$select_ivs) 

 })


 #proof that the independent variables are in fact in a matrix/dataframe
   output$data <- renderTable({
   df_indep()
  }) 


#This is the TEST ARIMA Model 

 modela <- reactive({
 
 modela <- auto.arima(df_sel(), xreg = df_indep()) #model with regressors
 #modela <- auto.arima(df_sel()) #model without regressors to demonstrate that it actually works without the xreg argument
 })

 #this is the solution to the xreg problem above, but there's no reason I can think of that xreg shouldn't be able to take a reactive data object like it was doing before... 
 #x = as.matrix(as.data.frame(lapply(df_indep(), as.numeric))) 
 # then set: xreg = x 
 

 output$model <- renderPrint({ 
 summary(modela())
 })




 }

 # Run the application 
 shinyApp(ui = ui, server = server)
  

Комментарии:

1. Вы уверены, что это не NULL так? Я предлагаю вам добавить browser() в качестве первой строки modela <- reactive({ ... }) и посмотреть, как df_indep() это выглядит. Если это NULL так, и это вызывает ошибку, рассмотрите возможность добавления req(df_indep()) в качестве первой строки, что предотвратит попытку запуска этого реактивного блока до тех пор, пока df_indep() он не станет «правдивым» (см. ?req , что это значит).

2. Я только что попробовал req(df_indep()); тот же эффект. Я пытаюсь понять, как прочитать вывод браузера ()

3. кроме того, вывод таблицы здесь: #доказательство того, что независимые переменные на самом деле находятся в выводе матрицы / фрейма данных $data <- renderTable({ df_indep() }) показывает, что объект df_indep() не равен нулю.

4.Когда вы разместили browser() в начале этого реактивного блока, confirmed df_indep() был не- NULL и структурирован, как вы ожидаете, а затем запущен auto.arima(df_sel(), xreg = df_indep()) вручную, сработало ли это? Если нет, то этот вопрос может не иметь ничего общего с shiny вашими данными и / или с тем, как процесс обрабатывает различные угловые случаи.

5. решено! блестящий. df_indep <- df() %>% select(ввод$select_ivs) %>% as.matrix() большое вам спасибо! Так что я могу предположить, возможно, обновление пакета dplyr, возможно?