Как рассчитать и вернуть результат указанной функции c R в приложении Shiny? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь использовать функцию R в своем блестящем приложении, но тщетно ... Эта функция называется «procedure_finale_shiny» и принимает много аргументов:

procedure_finale_shiny(0.3,0.3,0.1,0.1,0.2,c(30,50,60,70,80),c(1,2,3,4))

и возвращает список из двух элементов.

И для информации:

str(formals(procedure_finale_shiny))

возвращает

Dotted pair list of 7
 $ alpha_1      : symbol 
 $ alpha_2      : symbol 
 $ alpha_3      : symbol 
 $ alpha_4      : symbol 
 $ alpha_5      : symbol 
 $ choix_ratios : symbol 
 $ choix_modeles: symbol 

Я бы хотел, чтобы блестящее приложение вычислило и вернуло эти 2 элемента. Аргументы (параметры) будут выбираться пользователем (но пока не база данных, а просто параметры, называемые "Choix des paramètres" в пользовательском интерфейсе).

Я сейчас работаю только над первой tabPanel (1-я страница приложения).

Вот мой пользовательский интерфейс: https://milesfrancois.shinyapps.io/shiny/

А вот мой код (блестящее приложение):

library(dplyr)
library(ggplot2)
library(shiny)
library(DT)
library(ggrepel)
library(tidyr)
library(shinycssloaders)
library(shinythemes)
library(SwimmeR)
library(rsconnect)


button_color_css <- "
#DivCompClear, #FinderClear, #EnterTimes{
/* Change the background color of the update button
to blue. */
background: DodgerBlue;

/* Change the text size to 15 pixels. */
font-size: 15px;
}"

# Define UI
ui <- fluidPage(

  #Navbar structure for UI
  navbarPage("Selection de modeles", theme = shinytheme("slate"),
             tabPanel("Programme", fluid = TRUE, icon = icon("spinner"),
                      tags$style(button_color_css),
                      # Sidebar layout with a input and output definitions
                      sidebarLayout(
                        sidebarPanel(

                          h3("Chargement des donnees"),

                          fileInput("file", "Charger un jeu de donnees :"),

                          checkboxGroupInput(inputId = "DataExemple",
                                             label = "Utiliser les donnees de base :",
                                             choices = c("Donnees de base" = "D1")),

                          hr(),

                          actionButton(inputId = "DeleteData", label = "Supprimer les donnees", icon = icon("trash-alt")),

                          hr(),

                          h3("Implementation de la procedure de selection"),
                          #shinythemes::themeSelector(),


                          # Select modele
                          checkboxGroupInput(inputId = "ModeleFinder",
                                             label = "Choix des modele(s):",
                                             choices = c("Modele 1" = c(1), "Modele 2 " = c(2),"Modele 3 " = c(3),"Modele 4 " = c(4)),
                                             selected = "M1"),

                          hr(),


                          # Select ratio 1
                          sliderInput(inputId = "SliderRatio1",
                                      label = "Choix ratio 1",
                                      min = 0, max = 100, 30
                          ),

                          # Select ratio 2
                          sliderInput(inputId = "SliderRatio2",
                                      label = "Choix ratio 2",
                                      min = 0, max = 100, 30
                          ),

                          # Select ratio 3
                          sliderInput(inputId = "SliderRatio3",
                                      label = "Choix ratio 3",
                                      min = 0, max = 100, 30
                          ),

                          # Select ratio 4
                          sliderInput(inputId = "SliderRatio4",
                                      label = "Choix ratio 4",
                                      min = 0, max = 100, 30
                          ),

                          # Select ratio 5
                          sliderInput(inputId = "SliderRatio5",
                                      label = "Choix ratio 5",
                                      min = 0, max = 100, 30
                          ),

                          hr(),
                          hr(),

                          # Select alpha 1
                          sliderInput(inputId = "SliderAlpha1",
                                      label = "Importance du ratio",
                                      min = 0, max = 1, 0.3
                          ),

                          # Select alpha 2
                          sliderInput(inputId = "SliderAlpha2",
                                      label = "Importance de l'erreur d'apprentissage",
                                      min = 0, max = 1, 0.3
                          ),

                          # Select alpha 3
                          sliderInput(inputId = "SliderAlpha3",
                                      label = "Importance de l'erreur test",
                                      min = 0, max = 1, 0.3
                          ),

                          # Select alpha 4
                          sliderInput(inputId = "SliderAlpha4",
                                      label = "Importance du temps de calcul",
                                      min = 0, max = 1, 0.3
                          ),

                          # Select alpha 5
                          sliderInput(inputId = "SliderAlpha5",
                                      label = "Importance de la complexite du modele",
                                      min = 0, max = 1, 0.3
                          ),

                          hr(),
                          actionButton(inputId = "calculate", label = "Calculer", icon = icon("check")),
                          hr(),

                          h3("Sauvegarder les resultats"),

                          selectInput(inputId = "Export1",
                                      label = "Choisir le format",
                                      choices = c("csv", "texte","PDF","xlsx","SPSS","SAS","Stata"),
                                      selected = "csv"),


                          downloadButton("downloadData1", "Download")

                        ),

                        mainPanel(

                          ### add your style inline css values here

                          ### added a line of code here too `.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover `###
                          tags$style(HTML("
                                          .dataTables_wrapper .dataTables_length, .dataTables_wrapper .dataTables_filter, .dataTables_wrapper .dataTables_info, .dataTables_wrapper .dataTables_processing, .dataTables_wrapper .dataTables_paginate, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
                                          color: #ffffff;
                                          }
                                          ### ADD THIS HERE ###
                                          .dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#ffffff !important;border:1px solid transparent;border-radius:2px}

                                          ###To change text and background color of the `Select` box ###
                                          .dataTables_length select {
                                          color: #0E334A;
                                          background-color: #0E334A
                                          }

                                          ###To change text and background color of the `Search` box ###
                                          .dataTables_filter input {
                                          color: #0E334A;
                                          background-color: #0E334A
                                          }

                                          thead {
                                          color: #ffffff;
                                          }

                                          tbody {
                                          color: #000000;
                                          }

                                          "


                    )
  ),

                          h4("Tableau de resultats"),
                          dataTableOutput("tab_res"),

                          hr(),


                          h4("Meilleur modele"),
                          dataTableOutput("best_mod")


                        )

                      )
             ),  

             tabPanel("Code & Donnees", fluid = TRUE, icon = icon("database"),
                      sidebarLayout(
                        sidebarPanel(

                          h3("Affichage des donnees"),

                          radioButtons(inputId = "Display1",
                                       label = "",
                                       choices = c("preview", "str","summary"),
                                       selected = "preview"),

                          hr(),

                          h3("Affichage du code"),

                          checkboxGroupInput(inputId = "CodeR",
                                             label = "",
                                             choices = c("Afficher le code R" = "R1"))

                        ),

                        mainPanel()
                      )
             ),

             tabPanel("Graphiques", fluid = TRUE, icon = icon("chart-line"),
                      sidebarLayout(
                        sidebarPanel(

                          h3("Choix du modele"),

                          radioButtons(inputId = "Display2",
                                       label = "",
                                       choices = c("Modele 1", "Modele 2","Modele 3","Modele 4"),
                                       selected = "Modele 1"),

                          hr(),

                          h3("Sauvegarder le graphique"),

                          selectInput(inputId = "ExportGraph",
                                      label = "Choisir le format",
                                      choices = c("PNG", "JPEG","BMP"),
                                      selected = "PNG"),

                          downloadButton("downloadData2", "Download")

                        ),

                        mainPanel()
                      )
             ),

             navbarMenu("Plus d'informations", icon = icon("info-circle"),
                        tabPanel("Étude", fluid = TRUE,
                                 fluidRow(
                                   column(6,
                                          h4(p("Résumé")),
                                          h5(p("Cette étude a été réalisée au cours d'un stage de fin d'études en deuxième année de Master DSMS (Data Science et Modélisation Statistique) à l'Université de Bretagne Sud. Le stage s'est déroulé au sein du LMBA (Laboratoire de Mathématiques de Bretagne Atlantique) sur une période de six mois."),
                                             p("Le sujet du stage était le suivant : « Automatisation d'une procédure de sélection de modèles dans le cadre du Couplage Modèle-Données »."),
                                             p("Au cours d'un projet précédent, un outil avait été contruit afin d'ajuster un modèle (de type Couplage Modèle-Données) sur des données et de collecter certaines informations associées à celui-ci. L'objectif de notre stage était donc d'éprouver l'outil déjà existant, d'augmenter sa robustesse et son niveau de généricité et enfin d'automatiser la procédure complète de sélection de modèles."),
                                             p("Cette interface Shiny est en quelque sorte la mise en forme de nos travaux."),
                                             p("Les détails qui sont propres à notre programme sont référencés dans l'onglet intitulé « Détails ».")
                                          )
                                   ),
                                   column(6,
                                          h4(p("Le Couplage Modèle-Données")),
                                          h5(p("Si l'on se réfère aux travaux effectués par FLOURENT (2019) dans le domaine du Smart Farming (l'agriculture de précision), on peut dire que le Couplage Modèle-Données est une approche qui se situe à mi-chemin entre les approches dîtes « Black Box » et « White Box »."),
                                             p("Le type de modèle appelé « Black Box » fait en grande partie référence aux modèles classiques du Machine Learning (réseaux de neurones .). D'après GORCZYCA et al (2018), VALLETTA et al. (2017), MA et al. (2014) et IP et al. (2018), la popularité de ces modèles peut s'expliquer par leur facilité d'utilisation, ainsi que par la diversité des problèmes pouvant être résolus grâce à de tels algorithmes. Néanmoins ces modèles contiennent peu de connaissances a priori. Par conséquent, les outils basés sur ce type de modèles sont peu informatifs d'un point de vue biologique (TAN et GILBERT (2003), SHAVLIK et al. (1995), HUBBARD et REINHARDT (1998)). Il faut également noter qu'il est nécessaire d'apprendre les paramètres de ces modèles à partir de beaucoup de données et ceci dans le but de pallier l'absence d'expertise biologique (DUMPALA et al. (2017))"),
                                             p("À l'inverse, les modèles « White Box » correspondent à des modèles mécanistes réalistes (VAZQUEZ-CRUZ et al. (2014)). Si l'on se penche sur les travaux de BASTIANELLI et SAUVANT (1997) et MARTIN et SAUVANT (2010), la construction de modèles mécanistes réalistes est une tâche complexe menant généralement à un modèle contenant un grand nombre d'équations et de paramètres à déterminer. Ce type de modèle nécessite d'avoir beaucoup de connaissances concernant le système étudié."),
                                             p("On cite une nouvelle fois les travaux de FLOURENT : « Le Couplage Modèle-Données consiste à intégrer des connaissances concernant la dynamique du système étudié via la construction d'un modèle mathématique et à utiliser ensuite des données pour ajuster les paramètres du modèle construit ». On peut aussi reprendre les travaux de FRENOD (2017), ROUSSEAU et NODET (2013), SACKS et al. (2007) et WANG et al. (2010), et dire que le Couplage Modèles-Données consiste à construire un modèle mathématique parcimonieux, correspondant à une synthèse mathématique du système étudié.")
                                          )
                                   ))

                        ),

                        tabPanel("Détails", fluid = TRUE,
                                 fluidRow(
                                   column(6,
                                          #br(),
                                          h4(p("Modèles")),
                                          h5(p("Notre programme comporte trois types de modèles et quatre modèles différents. Deux modèles de type Couplage Modèle-Données (les modèles 1 et 2), un modèle de type réseau de neurones (le modèle 3) et un modèle de type linéaire (le modèle 4).")),
                                          br(),
                                          h4(p("Paramètres")),
                                          h5(p("Le premier modèle de type Couplage Modèle-Données est composé de trois paramètres ajustés. Le second modèle de type Couplage Modèle-Données est composé de deux paramètres ajustés et d'un paramètre fixe. Le modèle de type réseau de neurones est composé de trois couches cachées (la première et la troisième couches comportent trois neurones, la deuxième couche compte six neurones).")),
                                          br(),
                                          h4(p("Informations")),
                                          h5(p("Notre outil permet de collecter un certain nombre d'informations sur chacun des modèles comme l'erreur d'apprentissage, l'erreur test ou encore le temps de calcul. Certaines de ces informations nous sont utiles pour calculer notre indicateur de comparaison."))

                                          #hr(),

                                   ),
                                   column(6,
                                          #br(),
                                          h4(p("Indicateur")),
                                          h5(p("Notre indicateur de comparaison se base sur cinq informations différentes, à savoir : l'erreur test, l'erreur d'apprentissage, le temps de calcul, la complexité du modèle et la ratio.")),
                                          br(),
                                          h4(p("Programme")),
                                          h5(p("Le programme, sur la base de l'indicateur, renvoie le « meilleur » modèle ainsi qu'un tableau de résultats avec un certain nombre d'infomations. L'utilisateur a la possibilité de sélectionner les modèles qu'il souhaite comparer, de choisir différents ratios (taille des données d'apprentissage et de test) ainsi que les poids associés (alphas) aux paramètres de l'indicateur.")),
                                          br(),
                                          h4(p("Poids associés")),
                                          h5(p("alpha 1 : poids associé au ratio")),
                                          h5(p("alpha 2 : poids associé à l'erreur d'apprentissage")),
                                          h5(p("alpha 3 : poids associé à l'erreur test")),
                                          h5(p("alpha 4 : poids associé au temps de calcul")),
                                          h5(p("alpha 5 : poids associé à la complexité du modèle"))

                                   )
                                 ),
                                 br(),
                                 hr(),
                                 h6(      
                                   p(
                                     a("Université de Bretagne Sud", 
                                       href = "https://www.univ-ubs.fr/fr/index.html"),
                                     br(),
                                     br(),
                                     a("Laboratoire de Mathématiques de Bretagne Atlantique", 
                                       href = "http://www.lmba-math.fr/"))),

                                 h6("Conçu avec",
                                    img(src = "https://www.rstudio.com/wp-content/uploads/2014/04/shiny.png", height = "30px"),
                                    "par",
                                    img(src = "https://www.rstudio.com/wp-content/uploads/2014/07/RStudio-Logo-Blue-Gray.png", height = "30px"),
                                    ".")
                        )
             )
  )
)



work_dir_3 <- "C:\\Users\\François\\Desktop\\SHINY"
setwd(work_dir_3)
getwd()

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

#res1 = as.data.frame(procedure_finale_shiny(0.3,0.3,0.1,0.1,0.2,c(30,50,60,70,80),c(1,2,3,4))[[1]]) 
#res2 = as.data.frame(procedure_finale_shiny(0.3,0.3,0.1,0.1,0.2,c(30,50,60,70,80),c(1,2,3,4))[[2]])

server <- function(input, output) {


  result1 <- eventReactive(input$calculate, {

    as.data.frame(procedure_finale_shiny(input$SliderAlpha1,input$SliderAlpha2,input$SliderAlpha3,input$SliderAlpha4,input$SliderAlpha5,c(input$SliderRatio1,input$SliderRatio2,input$SliderRatio3,input$SliderRatio4,input$SliderRatio5,c(input$ModeleFinder)))[[1]])

  })


  result2 <- eventReactive(input$calculate, {

    as.data.frame(procedure_finale_shiny(input$SliderAlpha1,input$SliderAlpha2,input$SliderAlpha3,input$SliderAlpha4,input$SliderAlpha5,c(input$SliderRatio1,input$SliderRatio2,input$SliderRatio3,input$SliderRatio4,input$SliderRatio5,c(input$ModeleFinder)))[[2]])

  })


  output$best_mod <- renderDataTable({

    result2()

  })

  output$tab_res <- renderDataTable({

    result1()

  })



}




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


Заранее спасибо!

1 Ответ

1 голос
/ 28 мая 2020

Вы находитесь на правильном старте, но нет необходимости вычислять его дважды (и, возможно, много причин не делать этого). Попробуйте следующее:

server <- function(input, output, session) {
  results <- eventReactive(input$calculate, {
    procedure_finale_shiny(
      input$SliderAlpha1, input$SliderAlpha2, input$SliderAlpha3, input$SliderAlpha4, input$SliderAlpha5,
      c(input$SliderRatio1, input$SliderRatio2,input$SliderRatio3, input$SliderRatio4, input$SliderRatio5),
      as.numeric(input$ModeleFinder))
  })

  output$best_mod <- renderTable({ results()[[1]] })
  output$tab_res <- renderTable({ results()[[2]] })
}

Я не знаком с этой функцией (и это не имеет значения), но если вам нужен as.data.frame, это может быть более подходящим в renderDataTable, чем в eventReactive .

( Отредактировано несколько раз, чтобы учесть проблемы с функцией procedure_finale_shiny. А именно: (1) аргументы соотношения должны быть в векторе, а при вызове функции OP отсутствует close-paren для их группировки; и (2) последний аргумент функции (choix_modeles) требует числового c или целочисленного аргумента, а не блестящей строки, которая может возвращаться из входных данных.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...