Выходной прогнозный график и прогноз в блестящем приложении для R - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь создать инструмент, в котором пользователь может выбрать ряд параметров (например, партнер, бюджет, месяц, год) и получить прогнозируемое значение для показателя следующих месяцев.

Я построил несколько внешних функций для выполнения задачи. Каждая функция выполняет некоторые задачи и передает данные в следующую функцию, а последняя функция строит четыре модели, прогнозирует с использованием этих моделей, строит ggplots и сохраняет их в списке, к которому можно получить доступ после запуска функций.

Как извлечь графики и прогнозы, которые будут отображаться в приложении Shiny?

UI:

ui <- fluidPage(
  titlePanel("Forecasting Tool"),

  sidebarLayout(
    sidebarPanel(

  selectInput("Partner", h3("Partner"), 
      choices = list("all", "dsp","search","social"), selected = "all"),

       numericInput("Budget", 
           h3("Budget"), 
           value = 10000),

  selectInput("Month", h3("Month"), 
              choices = list("January", "February", "March", "April","May", 
                        "June", "July", "August", "September", "October", 
                        "November", "December"), 
            selected = "January"),

  selectInput("Year", h3("Year"), 
              choices = list(2018,2019), 
              selected = 2019),


   submitButton("Submit"), h3("")),

mainPanel(plotOutput("plot"))

  )
)

Как мне построить серверную функцию таким образом, чтобы она распознавала, что была нажата кнопка submit, и запускала внешние функции?

моя последняя функция называется reg_mod, и она запускает все остальные функции, а затем возвращает конечные объекты в списке (графики, прогнозы и т. Д.), Входные данные которого выглядят следующим образом:

reg_mod(partner, budget, month, year)

Могу ли я получить доступ к объектам и вывести их в функции сервера на основе пользовательского ввода? например:

plot = reg_mod(input$Partner, input$Budget, input$Month, input$year)

output$plot = renderPlot(plot[[1]])

где plot[[1]] вызывает первый объект, который является сюжетом из reg_mod

EDIT:

Итак, вот пример вспомогательной функции, которая создает некоторые данные и выводит график, который я хочу получить в блестящем приложении, аналогично тому, что я хочу сделать. (обратите внимание, что единственным вариантом выбора месяца является «Август» и 2017 год, что вполне приемлемо, можно просто запустить приложение и запустить по умолчанию).

Helper = function(partner, budget, month, year){

 nums = seq(0 , 10, length.out = 100)

 Registrations = 5 + 2*rnorm(100, 20, 7)*nums
 dates = seq.Date(as.Date("2017-01-01"), as.Date("2017-04-10"), by ="days")

  Registrations = data.frame(Date = dates, Registrations = Registrations)

  if(partner == "dsp" & month == "August" & year == 2017){

    Registrations$Registrations = 0.5*budget*Registrations$Registrations
  }

  if(partner == "search" & month == "August" & year == 2017){

    Registrations$Registrations = 2*budget*Registrations$Registrations

  }

  if(partner == "social" & month == "August" & year == 2017){

    Registrations$Registrations = budget*Registrations$Registrations

  }

  Plot = ggplot(data = Registrations, aes(x = Date)) + 
    geom_line(aes(y = Registrations, colour = "Actual"), size = 1)

  List_Read = list("Plot" = Plot)

  return(List_Read)

}

и вот мой интерфейс и функции сервера:

library(shiny)
library(ggplot2)
# Define UI for application that outputs ggplot
ui <-  fluidPage(
  titlePanel("Forecasting Tool"),

  sidebarLayout(
    sidebarPanel(

     selectInput("Partner", h3("Partner"), 
            choices = list("all", "dsp","search","social"), selected="dsp"),

  numericInput("Budget", 
               h3("Budget"), 
               value = 100),

selectInput("Month", h3("Month"), 
              choices = list("January", "February", "March", "April","May", 
              "June", "July",  "August", "September", "October", "November", 
              "December"), 
              selected = "August"),

  selectInput("Year", h3("Year"), 
              choices = list(2017,2018), 
              selected = 2017),


       submitButton("Submit"), h3("")),

mainPanel(plotOutput("plot"))

 )
)
# Define server logic required to output ggplot from helper function
server <- function(input, output, session) {

  source("C:/Users/ksiopes/Documents/Ad Hoc/Survival/Prefinal Insights 
   Function Files/For Shiny Function/Testing/Helper3.R", 
     local = FALSE)

  plot_List = eventReactive(input$Submit,{

    Helper(input$Partner, input$Budget, input$Month, input$Year)

  })

  #Output the plot
  output$plot<- renderPlot({
    plot = plot_List()
    plot[[1]]
  })

}

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

Редактировать 2:

library(shiny)
library(ggplot2)


source("C:/Users/ksiopes/Documents/Ad Hoc/Survival/Prefinal Insights 
Function Files/For Shiny Function/Testing/Helper3.R", local = TRUE)

# Define UI for application that uses function to create random data and 
output ggplot
ui <-  fluidPage(
  titlePanel("Forecasting Tool"),

  sidebarLayout(
    sidebarPanel(

      selectInput("Partner", h3("Partner"), 
              choices = list("all", "dsp","search","social"), selected = 
"dsp"),

      numericInput("Budget", 
                   h3("Budget"), 
                   value = 100),

      selectInput("Month", h3("Month"), 
                  choices = list("January", "February", "March", 
                   "April","May", "June", "July", "August", "September", 
                    "October", "November", "December"), 
              selected = "August"),

      selectInput("Year", h3("Year"), 
                  choices = list(2017,2018), 
                  selected = 2017),


      submitButton("Submit"), h3("")),

    mainPanel(plotOutput("plot"))

  )
)

# Define server logic required to run sourced function and output ggplot
server <- function(input, output, session) {


  plot_List = eventReactive(input$Submit,{



    Helper(input$Partner, input$Budget, input$Month, input$Year)


  })
    #Output the plot
    output$plot<- renderPlot({
    plot = plot_List()
    plot[[1]]

    })



}

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

1 Ответ

0 голосов
/ 14 января 2019

Вот общая схема того, как это сделать:

Загрузка внешних функций в блестящее приложение требует немного дополнительной работы, в отличие от локального сценария, но не так много. Мы все еще можем использовать функцию источника, единственное отличие - local=T должно быть установлено, и функция должна быть помещена в каталог приложения. Когда функция получена из источника, мы можем относительно легко передать ей пользовательский ввод.

Шаг 1) Сохранить скрипт с функцией в каталоге приложения (где находится server.R & ui.R или app.R)

Шаг 2) Источник функции

#Basically source the path to the function file you put in the app directory
source("your-app-dir/functions.R")

Шаг 3) Воспользуйтесь функцией вывода сюжета

server.R

server<-function(input,output,session){

#Function reg_mod in this file
source("your-app-dir/functions.R")

#Assuming the return of reg_mod is correct
plot_List<-eventReactive(input$Submit, {

reg_mod(input$Partner, input$Budget, input$Month, input$year)

})

#Output the plot
output$plot<- renderPlot({
plot<-plot_List()
plot[[1]] 
})


}

Дополнительную помощь по использованию внешних функций в Shiny можно найти здесь

Дополнительная помощь по использованию реактивных сред в этом примере здесь

Edit: Исправлена ​​ошибка, из-за которой график не рендерится: вы не активируете свою функцию для запуска, поскольку используете неверный элемент пользовательского интерфейса. Это должно быть actionButton не submitButton

actionButton("Submit", "Submit"), Используйте это вместо

Полный код

library(shiny)
library(ggplot2)


source("Helper3.R", local = TRUE)

# Define UI for application that uses function to create random data and 

ui <-  fluidPage(
  titlePanel("Forecasting Tool"),

  sidebarLayout(
    sidebarPanel(

      selectInput("Partner", h3("Partner"), 
                  choices = list("all", "dsp","search","social"), selected = 
                    "dsp"),

      numericInput("Budget", 
                   h3("Budget"), 
                   value = 100),

      selectInput("Month", h3("Month"), 
                  choices = list("January", "February", "March", 
                                 "April","May", "June", "July", "August", "September", 
                                 "October", "November", "December"), 
                  selected = "August"),

      selectInput("Year", h3("Year"), 
                  choices = list(2017,2018), 
                  selected = 2017),


      actionButton("Submit", "Submit"), 

      h3("")),

    mainPanel(plotOutput("plot"))

  )
)

# Define server logic required to run sourced function and output ggplot
server <- function(input, output, session) {


  plot_List<-eventReactive(input$Submit, {

    print("ran")
    Helper(input$Partner, input$Budget, input$Month, input$Year)



  })
  #Output the plot
  output$plot<- renderPlot({
    plot = plot_List()
    plot[[1]]

  })



}

# Run the application 
shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...