R/ProdACMTable.R

# PRODFACTO EN FONCTION ---------------

ProdACMTable <- function(table) {
  
  # GLOBAL ---------------
  library(shinythemes)
  library(scatterD3)
  library(DT)
  library(shinyjs)
  require(shiny)
  require(FactoMineR)
  require(explor)
  require(scatterD3)
  require(DT)
  require(cluster)
  require(JLutils)
  require(RColorBrewer)
  require(questionr)
  require(tidyverse)
  # require(tidyr)
  # require(dplyr)
  require(stringr)
  # require(stringi)
  # require(GDAtools)
  
  options(shiny.maxRequestSize=30*1024^2)
  
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  # Fonctions pour les graphiques -----------
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  
  # ACM Spéciales :
  # A FAIRE ?
  
  
  # MCA Var plot sans fixe = T
  MCA_var_data <- function(res, xax = 1, yax = 2, var_sup = TRUE, var_lab_min_contrib = 0) {
    tmp_x <- res$vars %>%
      arrange(Axis, Type, Variable) %>%
      filter(Axis == xax) %>%
      select_("Variable", "Level", "Type", "Class", "Coord", "Contrib", "Cos2", "Count")
    tmp_y <- res$vars %>% 
      filter(Axis == yax) %>%
      select_("Variable", "Level", "Type", "Class", "Coord", "Contrib", "Cos2", "Count")
    if (!(var_sup)) {
      tmp_x <- tmp_x %>% filter(Type == 'Active')
      tmp_y <- tmp_y %>% filter(Type == 'Active')
    }
    tmp <- tmp_x %>%
      left_join(tmp_y, by = c("Variable", "Level", "Type", "Class", "Count")) %>%
      mutate(Contrib = Contrib.x + Contrib.y,
             Cos2 = Cos2.x + Cos2.y,
             tooltip = paste(paste0("<strong>", Level, "</strong><br />"),
                             paste0("<strong>",
                                    gettext("Variable", domain = "R-explor"),
                                    ":</strong> ", Variable, "<br />"),
                             paste0("<strong>Axis ",xax," :</strong> ", Coord.x, "<br />"),
                             paste0("<strong>Axis ", yax," :</strong> ", Coord.y, "<br />"),
                             ifelse(is.na(Cos2), "",
                                    paste0("<strong>",
                                           gettext("Squared cosinus", domain = "R-explor"),
                                           ":</strong> ", Cos2, "<br />")),
                             ifelse(is.na(Contrib), "",
                                    paste0("<strong>",
                                           gettext("Contribution:", domain = "R-explor"),
                                           "</strong> ", Contrib, "<br />")),
                             ifelse(is.na(Count), "",
                                    paste0("<strong>",
                                           gettext("Count:", domain = "R-explor"),
                                           "</strong> ", Count))),
             Lab = ifelse(Contrib >= as.numeric(var_lab_min_contrib) | 
                            is.na(Contrib) & as.numeric(var_lab_min_contrib) == 0, Level, ""))
    data.frame(tmp)
  }
  
  
  MCA_var_plot2 <- function(res, xax = 1, yax = 2, var_sup = TRUE, var_lab_min_contrib = 0,
                            point_size = 64,
                            col_var = NULL,
                            symbol_var = NULL,
                            size_var = NULL,
                            size_range = c(10,300),
                            zoom_callback = NULL,
                            in_explor = FALSE, ...) {
    
    ## Settings changed if not run in explor
    html_id <- if(in_explor) "explor_var" else  NULL
    dom_id_svg_export <- if(in_explor) "explor-var-svg-export" else NULL
    dom_id_lasso_toggle <- if(in_explor) "explor-var-lasso-toggle" else NULL
    lasso <- if(in_explor) TRUE else FALSE 
    lasso_callback <- if(in_explor) explor_multi_lasso_callback() else NULL
    zoom_callback <- if(in_explor) explor_multi_zoom_callback(type = "var") else NULL
    
    var_data <- MCA_var_data(res, xax, yax, var_sup, var_lab_min_contrib)
    
    scatterD3::scatterD3(
      x = var_data[, "Coord.x"],
      y = var_data[, "Coord.y"],
      xlab = names(res$axes)[res$axes == xax],
      ylab = names(res$axes)[res$axes == yax],
      lab = var_data[, "Lab"],
      point_size = point_size,
      point_opacity = 1,
      col_var = if (is.null(col_var)) NULL else var_data[,col_var],
      col_lab = col_var,
      symbol_var = if (is.null(symbol_var)) NULL else var_data[,symbol_var],
      symbol_lab = symbol_var,
      size_var = if (is.null(size_var)) NULL else var_data[,size_var],
      size_lab = size_var,
      size_range = if (is.null(size_var)) c(10,300) else c(30,400) * point_size / 32,
      tooltip_text = var_data[, "tooltip"],
      type_var = ifelse(var_data[,"Class"] == "Quantitative", "arrow", "point"),
      unit_circle = var_sup && "Quantitative" %in% var_data[,"Class"],
      key_var = paste(var_data[, "Variable"], var_data[, "Level"], sep = "-"),
      fixed = FALSE,
      html_id = html_id,
      dom_id_svg_export = dom_id_svg_export,
      dom_id_lasso_toggle = dom_id_lasso_toggle,
      lasso = lasso,
      lasso_callback = lasso_callback,
      zoom_callback = zoom_callback,
      ...
    )  
  }
  # Adaptation des graphiques des individus d'explor (Julien Barnier) :
  MCA_ind_data <- function(res, xax = 1, yax = 2, ind_sup, col_var = NULL, 
                           ind_lab_min_contrib = 0,opacity_var = NULL) {
    tmp_x <- res$ind %>% 
      filter(Axis == xax) %>%
      select(Name, Type, Coord, Contrib, Cos2)
    if (!ind_sup)
      tmp_x <- tmp_x %>% filter(Type == "Active")
    tmp_y <- res$ind %>% 
      filter(Axis == yax) %>%
      select(Name, Type, Coord, Contrib, Cos2)
    if (!ind_sup)
      tmp_y <- tmp_y %>% filter(Type == "Active")
    tmp <- tmp_x %>%
      left_join(tmp_y, by = c("Name", "Type")) %>%
      mutate(Contrib = Contrib.x + Contrib.y,
             Cos2 = Cos2.x + Cos2.y,
             tooltip = paste(paste0("<strong>", Name, "</strong><br />"),
                             paste0("<strong>Axis ", xax," :</strong> ", Coord.x, "<br />"),
                             paste0("<strong>Axis ", yax," :</strong> ", Coord.y, "<br />"),
                             ifelse(is.na(Cos2), "",
                                    paste0("<strong>",
                                           gettext("Squared cosinus", domain = "R-explor"),
                                           ":</strong> ", Cos2, "<br />")),
                             ifelse(is.na(Contrib), "",
                                    paste0("<strong>",
                                           gettext("Contribution:", domain = "R-explor"),
                                           "</strong> ", Contrib, "<br />"))),
             Lab = ifelse(Contrib >= as.numeric(ind_lab_min_contrib) | 
                            (is.na(Contrib) & as.numeric(ind_lab_min_contrib) == 0), Name, ""))
    if (!(is.null(col_var) || col_var %in% c("None", "Type"))) {
      tmp_data <- res$quali_data %>% select_("Name", col_var)
      tmp <- tmp %>%
        left_join(tmp_data, by = "Name")
    }
    data.frame(tmp)
  }
  
  MCA_ind_plot <- function(res, xax = 1, yax = 2, ind_sup = TRUE,
                           col_var = NULL,
                           symbol_var = NULL,
                           opacity_var = NULL,
                           size_var = NULL,
                           size_range = c(10,300),
                           lab_var = NULL,
                           zoom_callback = NULL,
                           in_explor = FALSE,
                           ind_lab_min_contrib = 0,
                           ...) {
    
    html_id <- if(in_explor) "explor_ind" else  NULL
    dom_id_svg_export <- if(in_explor) "explor-ind-svg-export" else NULL
    dom_id_lasso_toggle <- if(in_explor) "explor-ind-lasso-toggle" else NULL
    lasso <- if(in_explor) TRUE else FALSE 
    lasso_callback <- if(in_explor) explor_multi_lasso_callback() else NULL
    zoom_callback <- if(in_explor) explor_multi_zoom_callback(type = "ind") else NULL
    
    ind_data <- MCA_ind_data(res, xax, yax, ind_sup, col_var,ind_lab_min_contrib)
    
    scatterD3::scatterD3(
      x = ind_data[, "Coord.x"],
      y = ind_data[, "Coord.y"],
      xlab = names(res$axes)[res$axes == xax],
      ylab = names(res$axes)[res$axes == yax],
      lab=ind_data[,"Lab"],
      col_var = if (is.null(col_var)) NULL else ind_data[,col_var],
      col_lab = col_var,
      opacity_var = if (is.null(opacity_var)) NULL else ind_data[,opacity_var],
      tooltip_text = ind_data[, "tooltip"],
      key_var = ind_data[, "Name"],
      fixed = TRUE,
      html_id = html_id,
      dom_id_svg_export = dom_id_svg_export,
      dom_id_lasso_toggle = dom_id_lasso_toggle,
      lasso = lasso,
      lasso_callback = lasso_callback,
      zoom_callback = zoom_callback,
      ...)
    
  }
  
  shinyApp(
    # UI --------------------------
    ui =navbarPage("Analyse de Correspondances Multiples",
                   
                   
                   #--------------------------- ONGLET DONNEES / selection -------------------------
                   
                   tabPanel(
                     "1. Chargement",
                     
                     fluidPage(
                       
                       
                       
                       # 1ère colonne :
                       
                       
                       column(5,
                              h6(strong('/!\\ Avant toute opération, cliquer que le bouton "Open in browser" 
                                        en haut à gauche afin de pouvoir télécharger les résultats') ),
                              
                              h4("1.1. Fichier à charger (.txt ou .csv)"),
                              h6("La table brute est une base de données dont les lignes correspondent aux individus statistiques.
                                 Elle doit être en format texte (.txt ou .csv) ; Le délimitateur, 
                                 l'extension du fichier et l'encodage des caractères sont précisés.
                                 Elle est importée en passant par le bouton \"browse\"."),
                              wellPanel(
                                uiOutput("donnees.fichier.ui")),
                              h4("1.2. Vérifier les données d'entrée"),
                              h6("Vérifier que le tableau a correctement été 
                                 importé à l'aide du résumé du tableau :"),
                              textOutput("Dimensions"),
                              tableOutput("Resume")),
                       
                       # 2ème colonne :
                       
                       
                       column(7,
                              fluidRow(column(6, 
                                              h4("2. Choix de l'identifiant (Obligatoire)"),
                                              uiOutput("SelectID"),
                                              uiOutput("ErreurID"),
                                              h6("Si la table ne contient pas d'identifiant
                                                 unique, le bouton ci-dessous permet de 
                                                 télécharger la table à laquelle sera ajouté
                                                 une variable \"ID\"."),
                                              h6(strong("/!\\ Si le tableau comporte déjà une variable\"ID\", elle sera remplacée.")),
                                              downloadButton("PasDID",'Télécharger avec ajout d\'un identifiant ("ID")')
                              ),
                              
                              column(6,
                                     uiOutput("SelectLabelGraphInd"),
                                     uiOutput("ErreurLabelGraphInd")
                              )),
                              
                              
                              h4("3. Sélection des individus (Optionnel)"),
                              h6("Ces filtres peuvent réduire et préciser la population étudiée. Ce sont des filtres logiques.
                                 Si on ne souhaite aucune sélection, penser à sélectionner un choix vide sur chaque champ."),
                              h6("Les filtres intermédiaires entre les critères portent sur les individus :"),
                              h6("ET : Une même ligne ne sera conservée que si elle satisfait aux deux critères ;"),
                              h6("OU : Une ligne sera conservée si elle répond au 1er critère ou bien si elle répond au 2ème critère."),
                              wellPanel(
                                p(strong("Critère 1 :"), align="left"),
                                fluidRow( column(5,
                                                 uiOutput("SelectVar1")),
                                          column(2,
                                                 selectInput("Operateur1", "Opérateur :",
                                                             choices=as.list(c(" ","=","diff. de",">",">=","<","<=")))),
                                          column(5,
                                                 
                                                 uiOutput("Select")))
                                
                                
                              ),
                              selectInput("OperateurMid","",
                                          choices=as.list(c(" ","OU","ET")), selected = NULL),
                              wellPanel(
                                p(strong("Critère 2 :"), align="left"),
                                fluidRow( column(5,
                                                 uiOutput("SelectVar2")),
                                          column(2,
                                                 selectInput("Operateur2", "Opérateur :",
                                                             choices=as.list(c(" ","=","diff. de",">",">=","<","<=")))),
                                          column(5,
                                                 
                                                 uiOutput("Select2")))),
                              
                              selectInput("OperateurMid2","",
                                          choices=as.list(c(" ","OU","ET")), selected = NULL),
                              wellPanel(
                                p(strong("Critère 3 :"), align="left"),
                                fluidRow( column(5,
                                                 uiOutput("SelectVar3")),
                                          column(2,
                                                 selectInput("Operateur3", "Opérateur :",
                                                             choices=as.list(c(" ","=","diff. de",">",">=","<","<=")))),
                                          column(5,
                                                 
                                                 uiOutput("Select3")))
                              ),
                              
                              selectInput("OperateurMid3","",
                                          choices=as.list(c(" ","OU","ET")), selected = NULL),
                              wellPanel(
                                p(strong("Critère 4 :"), align="left"),
                                fluidRow( column(5,
                                                 uiOutput("SelectVar4")),
                                          column(2,
                                                 selectInput("Operateur4", "Opérateur :",
                                                             choices=as.list(c(" ","=","diff. de",">",">=","<","<=")))),
                                          column(5,
                                                 
                                                 uiOutput("Select4")))))
                       )),
                   
                   #--------------------------- ONGLET ACM / Inertie -------------------------
                   
                   tabPanel("2. Modèle et valeurs propres",
                            column(6,
                                   
                                   h4("1.1. Vérifier : Tri à plat des variables"),
                                   h6("Le tri à plat des variables permet de vérifier 
                                      si les filtres ont produit la sélection de population attendue."),
                                   uiOutput("SelectVarTri"),
                                   textOutput("TypeVarTri"),
                                   h4("1.2. Facultatif et uniquement pour les tris à plat"),
                                   selectInput("ChangementVarTri","Changer le type de la variable",
                                               choices=as.list(c("Pas de modification",
                                                                 "Qualitative",
                                                                 "Quantitative",
                                                                 "Logique")), selected = "Pas de modification"),
                                   h4(""),
                                   tableOutput("TableVarTri"),
                                   h4("2.1. Sélection des variables pour l'ACM - actives et supplémentaires"),
                                   h6("Sélection de l'ensemble 
                                      des variables intégrées à l'ACM, actives ET supplémentaires."),
                                   h6("Pour l'ACM, les variables actives sont automatiquement converties en 
                                      variables qualitatives (peu importe leur nature originale)."),
                                   wellPanel(
                                     checkboxInput("SelectAll", "Tout sélectionner", value=FALSE),
                                     uiOutput("SelectACM")
                                   ),
                                   #  h4("ACM SPECIALE"),
                                   #   verbatimTextOutput("TEST"),
                                   
                                   #   checkboxInput("ACMSpe", "ACM Spéciale", value= FALSE),
                                   #  uiOutput("Choose_ModaSpe"),
                                   h4("2.2. Choix des variables illustratives"),
                                   h6("Parmi les variables conservées, sélection de celles 
                                      qui seront considérées comme supplémentaires (projetées 
                                      sur les plans factoriels mais ne participant pas à leur construction)."),
                                   h6("On distingue les variables supplémentaires qualitatives et quantitatives :"),
                                   h5("2.2.1. Qualitatives"),
                                   wellPanel(uiOutput("SelectIllus")),
                                   h5("2.2.2. Quantitatives"),
                                   wellPanel(uiOutput("SelectIllusQuanti")),
                                   h4("2.3. Variables conservées"),
                                   h6("Rappel des variables conservées et de leurs types :"),
                                   tableOutput("Type")),
                            column(6,
                                   uiOutput("SelectNbreAxes"),
                                   h4("3.1. Valeurs propres"),
                                   tableOutput("ValeursPropres"),
                                   h4("3.2. Graphiques des VP"),
                                   plotOutput("Variance"),
                                   plotOutput("VarianceCum"))),
                   
                   
                   #--------------------------- ONGLET Graphes des modalités ----------------------
                   
                   tabPanel("3. Variables : Graphiques",
                            fluidPage(
                              h4("Graphique des axes :"),
                              fluidRow(column(2,numericInput("VarAxeA", "", 1)),
                                       column(2,  numericInput("VarAxeB", "et", 2))),
                              
                              numericInput("MinContribVar1",
                                           "Afficher les étiquettes des modalités dont la contribution est
                                           supérieure à : ",2),
                              fluidRow(column(1,scatterD3Output("GraphVarAxeB", width = "75px", height = "600px") ),
                                       column(11, scatterD3Output("GraphVar"))),
                              fluidRow(column(1),
                                       column(11,scatterD3Output("GraphVarAxeA", width = "615px", height = "75px"))),
                              
                              
                              
                              h4("Graphique des axes :"),
                              fluidRow(column(2,numericInput("VarAxeC", "", 3)),
                                       column(2,  numericInput("VarAxeD", "et", 4))),
                              numericInput("MinContribVar2",
                                           "Afficher les étiquettes des modalités dont la contribution est
                                           supérieure à : ",2),
                              fluidRow(column(1,scatterD3Output("GraphVarAxeD", width = "75px", height = "600px") ),
                                       column(11, scatterD3Output("GraphVar2"))),
                              fluidRow(column(1),
                                       column(11,scatterD3Output("GraphVarAxeC", width = "615px", height = "75px")))
                              )),
                   
                   #--------------------------- ONGLET Tableaux des modalités -------------------------
                   
                   tabPanel("4. Variables : Tables",
                            fluidPage(column(6,h4("Variables"), wellPanel(fluidRow(
                              column(6,
                                     h4("Axe n°"),
                                     numericInput("AxeVar1", NA,1)),
                              column(6,
                                     h4("Contribution supérieure à"),
                                     numericInput("ContribVar1", NA,2)))),
                              dataTableOutput("TableVar"),
                              downloadButton("DlTableVar1","Télécharger")),
                              column(6,h4("Variables"),wellPanel(fluidRow(
                                column(6,
                                       h4("Axe n°"),
                                       numericInput("AxeVar2", NA,2)),
                                column(6,
                                       h4("Contribution supérieure à"),
                                       numericInput("ContribVar2", NA,2)))),
                                dataTableOutput("TableVar2"),
                                downloadButton("DlTableVar2","Télécharger")))),
                   
                   #--------------------------- ONGLET Classification -------------------------
                   
                   
                   tabPanel("5. Classification",
                            fluidRow(column(2, h4("1.1. Type de classification"),
                                            h6("/!\\ Pour l'instant, que hiérarchique ascendante et l'agrégation par les diamètres ne fonctionne pas"),
                                            selectInput("Type.Cl", "",
                                                        choices=as.list(c("Hiérarchique","Non hiérarchique", "Pas de classification")),
                                                        selected="Hiérarchique")),
                                     column(2,h4("Options de la classification :"),
                                            uiOutput("NbAxes.Cl.Choix")),
                                     column(2,
                                            uiOutput("Metric.Cl.Choix"),
                                            uiOutput("Agreg.Cl.Choix")),
                                     column(2,
                                            uiOutput("Part.H.Cl.Choix"),
                                            uiOutput("NbreCl.Cl.Choix"))),
                            fluidRow(
                              column(6,h4("2.1. Dendrodramme"),
                                     plotOutput("plot")),
                              column(6,h4 ("2.2. Graphe de l'inertie"),
                                     plotOutput("plot3"))
                            ),
                            fluidRow(
                              column(3,h4("3. Effectifs par classe"),
                                     tableOutput("TableEffClasses")),
                              column(9,
                                     h4("4. Croisement des classes avec d'autres variables (% en colonnes pour var quali)"),
                                     wellPanel(uiOutput("SelectVarClasses")),
                                     tableOutput("TableVarClasses"),
                                     downloadButton("DlCroisCl","Télécharger"))),
                            fluidRow(column(8,h4("5. Classes des individus"),
                                            dataTableOutput("IndEtClasses")),
                                     column(4,h4("6. Téléchargements"),
                                            downloadButton('TableIndividusClasses', 'Télécharger les noms et \n classes uniquement'),
                                            hr(),
                                            downloadButton('TableDepClasses', 'Télécharger la table de départ 
                                                           avec les classes') ))),
                   
                   
                   #--------------------------- ONGLET Graphes des individus -------------------------
                   
                   
                   tabPanel("6. Individus : Graphiques",
                            fluidPage(  
                              h4("Graphique des axes :"),
                              
                              fluidRow(column(2,numericInput("IndAxe1", "", 1)),
                                       column(2,  numericInput("IndAxe2", "et", 2))),
                              fluidRow(column(4,h4("Catégories et étiquettes :"),
                                              uiOutput("SelectVarClassesGraphe")
                              ),
                              column(4,numericInput("MinContrib1","Afficher les étiquettes des individus dont la contribution est
                                                    supérieure à : ",.5))),
                              checkboxInput("Ellipse", "Représenter les ellipses", value=FALSE),
                              scatterD3Output("GraphInd"),
                              
                              h4("Graphique des axes :"),
                              fluidRow(column(2,numericInput("IndAxe3", "", 3)),
                                       column(2,  numericInput("IndAxe4", "et", 4))),
                              numericInput("MinContrib2","Afficher les étiquettes des individus dont la contribution est
                                           supérieure à : ",.5),
                              checkboxInput("Ellipse2", "Représenter les ellipses", value=FALSE),
                              scatterD3Output("GraphInd2"))),
                   
                   #--------------------------- ONGLET Tableaux des individus -------------------------
                   
                   
                   tabPanel("7. Individus : Tables",
                            fluidPage(column(6, h4("Individus"), wellPanel(fluidRow(
                              column(6,
                                     h4("Axe n°"),
                                     numericInput("AxeInd1", NA,1)),
                              column(6,
                                     h4("Contribution supérieure à"),
                                     numericInput("ContribInd1", NA,.5)))),
                              dataTableOutput("TableInd"),
                              downloadButton("DlTableInd1","Télécharger")),
                              column(6,h4("Individus"),wellPanel(fluidRow(
                                column(6,
                                       h4("Axe n°"),
                                       numericInput("AxeInd2", NA,2)),
                                column(6,
                                       h4("Contribution supérieure à"),
                                       numericInput("ContribInd2", NA,.5)))),
                                dataTableOutput("TableInd2"),
                                downloadButton("DlTableInd2","Télécharger")))),
                   
                   
                   #--------------------------- ONGLET Métadonnées sur la session ACM---------------------
                   
                   tabPanel("8. Données sur la session en cours",
                            fluidPage(
                              h6("Table des métadonnées de la session en cours, issue des sélections et choix effectués."),
                              tableOutput("TableMeta"),
                              downloadButton("DLMetaDonnees", "Télécharger la table")
                            ))
                   #
                   # 
                   #--------------------------- Mises en forme -------------------------
                   # 
                   # tags$style(type="text/css",
                   #            ".shiny-output-error { visibility: hidden; }",
                   #            ".shiny-output-error:before { visibility: hidden; }")
                   
                   
                   , tags$head(tags$style(HTML(
                     "h6{ background-color: #FFF3BE ; font-size:16px;
                     font-family: calibri, Arial, sans-serif ; font-size:16px;}")
                     #,type="text/css",
                     #          ".shiny-output-error { visibility: hidden; }",
                     #           ".shiny-output-error:before { visibility: hidden; }"
                   )
                   ),theme=shinytheme("united")
                   
                   
                   
                              )
    ,
    # SERVER --------------
    server =
      function(input, output, session) { 
        
        # A/ Mise en forme et modifications de la table brute importée --------------
        #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        
        # Données importées (adaptation d'explore-data, Paris Descartes) :
        output$donnees.fichier.ui <- renderUI({
          list(
            fileInput("donnees.fichier.input", "Choisir le fichier :"),
            radioButtons("donnees.fichier.header", 
                         "Noms de variables en 1ère ligne :",
                         c("oui", "non")),
            radioButtons("donnees.fichier.sep", 
                         "Séparateur de champs :", 
                         c("point-virgule" = ";", 
                           "virgule" = ",", 
                           "espace" = " ", 
                           "tabulation" = "\t")),
            radioButtons("donnees.fichier.dec", 
                         "Séparateur de décimales :",
                         c("point" = ".", "virgule" = ",")),
            radioButtons("donnees.fichier.enc",
                         "Encodage des caractères :",
                         c("UTF-8 (par défaut sur Linux/Mac)" = "UTF-8",
                           "Windows-1252 (par défaut sur Windows)" = "WINDOWS-1252")),
            uiOutput("donnees.fichier.ok")
          )
          
        })
        file_name <- reactive({
          inFile <- input$donnees.fichier.input
          if (is.null(inFile))
            return("NULL")
          return (stringi::stri_extract_first(str = inFile$name, regex = ".*(?=\\.)"))
        })
        donnees_entree <-reactive({
          if (is.null(table)==F) 
            don <- table
          try({
            don <- read.table(
              input$donnees.fichier.input$datapath, 
              header = input$donnees.fichier.header == "oui", 
              sep = input$donnees.fichier.sep,
              dec = input$donnees.fichier.dec, 
              fileEncoding = input$donnees.fichier.enc,
              stringsAsFactors = FALSE)
          }, silent = TRUE)
          don <- unique(don)
          for (i in 1:ncol(don)){
            if (class(don[,i])!="numeric" &&class(don[,i])!="integer" )
            { don[,i][is.na(don[,i])]<-""}}
          
          don
        })
        
        
        donnees_entree2 <- reactive ({
          LabelGraphInd <- input$LabelGraphInd
          don <- donnees_entree()
          if (is.null(LabelGraphInd)) don 
          row.names(don)<- don[,LabelGraphInd]
          
          don
        })
        
        # setwd("C:/Users/Cecile Rodriguez/Documents/Recherche/TMI2")
        #  donnees_entree <- read.csv2("EtatCivil/BiosFinal.csv") 
        #  donnees_entree$X <- NULL
        #  donnees_entree <- unique (donnees_entree)
        #  names(donnees_entree)[5]<-"Prenom"
        #  row.names (donnees_entree)<- paste0(donnees_entree$Noms, ".",donnees_entree$Prénom)
        # donnees_entree
        
        # taille et str du tableau de départ :  
        
        output$Dimensions <- renderText(
          if (is.null(input$donnees.fichier.input)) return ("")
          else {
            paste("Tableau constitué de", ncol(donnees_entree()),
                  "colonnes et de", nrow(donnees_entree()),"lignes.
                  Détail des variables :")
            
          })
        
        output$Resume <- renderTable({
          
          if (is.null(input$donnees.fichier.input)) return (NULL)
          tmp<-donnees_entree()
          donnees_entree<- data.frame( Variable = names(tmp[1]),
                                       Type = class(tmp[,1]),
                                       NbreValeursDiff = nrow(unique(tmp[1])))
          for (i in (2:ncol(tmp))) {
            donnees_entree<-rbind(donnees_entree, data.frame( Variable = names(tmp[i]),
                                                              Type = class(tmp[,i]),
                                                              NbreValeursDiff = nrow(unique(tmp[i]))))
          }
          donnees_entree
        })
        
        
        # Listes déroulantes dynamiques :
        
        ## Modalités du 1er critère :
        Choose_Field <- reactive({
          Var1 <- input$Variable1
          donnees_entree <- donnees_entree()
          if (is.null(input$Variable1)) return (NULL)
          Choose_Field <- as.list(c("",unique(as.character(donnees_entree[,Var1]))))
        })
        
        ## Modalités du 2ème critère :
        Choose_Field2 <- reactive({
          if (is.null(input$Variable2)) return (NULL)
          donnees_entree <- donnees_entree()
          Var2 <- input$Variable2
          Choose_Field <- as.list(c("",unique(as.character(donnees_entree[,Var2]))))
        })
        
        ## Modalités du 3ème critère :
        Choose_Field3 <- reactive({
          donnees_entree <- donnees_entree()
          Var3 <- input$Variable3
          if (is.null(input$Variable3)) return (NULL)
          Choose_Field <- as.list(c("",unique(as.character(donnees_entree[,Var3]))))
        })
        
        ## Modalités du 4ème critère :
        Choose_Field4 <- reactive({
          donnees_entree <- donnees_entree()
          Var4 <- input$Variable4
          if (is.null(input$Variable4)) return (NULL)
          Choose_Field <- as.list(c("",unique(as.character(donnees_entree[,Var4]))))
        })
        
        ## Variables conservées dans l'ACM (pour var illustratives) :
        Choose_Illus <- reactive ({
          Vars <- input$VarPourACM
          donnees_entree <- test()
          validate(need(length(input$VarPourACM)>1, " "))
          if (is.null(input$VarPourACM)) return (NULL)
          Choose_Illus <- data.frame(donnees_entree[,Vars])
        })
        
        ## ACM spéciale : Index pour choix des modalités à exclure :
        Choose_Spe <- reactive ({
          TableACM <- TableACM()
          
          if (is.null(TableACM)) return (NULL)
          Choose_Spe <- GDAtools::getindexcat(TableACM)
        })
        
        output$Choose_ModaSpe <- renderUI({
          
          ACMSpe <- input$ACMSpe
          
          #  if (ACMSpe == TRUE ) {
          #  selectizeInput("ModaSpe", "Choix des modalités à exclure :",
          #               choices=c(" ",Choose_Spe()) , selected = NULL, multiple = TRUE)  
          #  }
          
        })
        
        ListeModaSpe <- reactive({
          ModaSpe <- input$ModaSpe
          Choose_Spe <- Choose_Spe()
          c<-which(as.list(Choose_Spe)== ModaSpe[1])
          if (length(ModaSpe)<2){
            c<-which(as.list(Choose_Spe)== ModaSpe[1])
          }else{
            c<-which(as.list(Choose_Spe)== ModaSpe[1])
            #if (length(VarsIllus>1))
            for (i in 2:length(ModaSpe)) {
              c <- c(c, which(as.list(Choose_Spe)== ModaSpe[i]))
            }
          }
          c
          
        })
        
        
        # Elements de sélection / choix / input -----
        #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        
        # Sélection des individus :
        
        ## Choix de l'identifiant (pour jointures des différents tableaux "critères"):
        output$SelectID <- renderUI({
          selectInput("ID", "Choix de l'identifiant (doit être unique) :",
                      choices=c(" ",names(donnees_entree())) , selected = NULL)  
        }) 
        
        ## Message d'erreur identifiant :
        
        
        output$ErreurID <- renderUI({
          
          ID <- input$ID
          Donnees <- donnees_entree()
          
          validate(
            need(is.null(Donnees)==F , "Charger une table")
          )
          
          if (ID == " ") {return ("Sélectionner une variable")} else{
            if (length(unique(Donnees[,ID]))==nrow(Donnees)){"Identifiant OK"}else{
              p("Identifiant pas OK : en choisir un autre ou \n télécharger la table avec un ID :", style = "color:red")
            }
          }
        })
        
        # Choix de la variable donnant les noms des étiquettes "individus" :
        
        output$SelectLabelGraphInd <- renderUI({
          selectInput("LabelGraphInd", "Noms des individus (Même variable que l'identifiant, par défaut) :",
                      choices=c(" ",names(donnees_entree())) , selected = input$ID)  
        }) 
        
        
        ## Message d'erreur étiquette graphe individu :
        
        
        output$ErreurLabelGraphInd <- renderUI({
          
          LabelGraphInd <- input$LabelGraphInd
          Donnees <- donnees_entree()
          
          validate(
            need(is.null(Donnees)==F , "Charger une table")
          )
          
          if (LabelGraphInd == " ") {return ("Sélectionner une variable")}else{
            if (length(unique(Donnees[,LabelGraphInd]))==nrow(Donnees)){"Label OK"}else{
              p("Label pas OK : en choisir un autre ou laisser l'identifant pas défaut", style = "color:red")
            }
          }
        })
        
        
        
        # Sélection des variables :
        
        ## Choix des variables pour l'ACM :    
        output$SelectACM <- renderUI({
          if (input$SelectAll == TRUE){
            selectizeInput("VarPourACM", "Variables pour l'ACM :", 
                           choices = names(donnees_entree()), 
                           selected = names(donnees_entree()), multiple = TRUE,
                           options = NULL)
          }
          else if (input$SelectAll == FALSE) {
            selectizeInput("VarPourACM", "Variables pour l'ACM :", 
                           choices = names(donnees_entree()), 
                           selected = NULL, multiple = TRUE,
                           options = NULL)
          }
        })
        
        ## Choix des variables illustratives de l'ACM :
        output$SelectIllus <- renderUI({
          
          ## Validations / erreurs
          validate(
            need(nrow(donnees_entree())!=0, "Charger une table (onglet 1)")
          )
          
          
          validate(
            need(input$ID!= " ", "Sélectionner un identifiant (onglet 1)")
          )
          
          
          
          ## Contenu
          
          selectizeInput("VarIllusPourACM", "Variables illustratives quali (parmi celles conservées pour l'ACM) :", 
                         choices = names(Choose_Illus()), 
                         selected = NULL, multiple = TRUE,
                         options = NULL)
        })
        
        
        output$SelectIllusQuanti <- renderUI({
          ## Validations / erreurs
          validate(
            need(nrow(donnees_entree())!=0, "Charger une table (onglet 1)")
          )
          
          
          validate(
            need(input$ID!= " ", "Sélectionner un identifiant (onglet 1)")
          )
          
          
          ## Contenu
          selectizeInput("VarIllusQuantiPourACM", "Variables illustratives quanti (parmi celles conservées pour l'ACM) :", 
                         choices = names(Choose_Illus()), 
                         selected = NULL, multiple = TRUE,
                         options = NULL)
        })
        
        
        ## Choix des variables illustratives QUANTI de l'ACM :
        
        
        
        # Sélection des variables, opérateurs et modalités de chaque critère :
        
        output$SelectVar1 <- renderUI ({
          selectInput("Variable1", "Variable :",
                      choices=as.list(c(" ",names(donnees_entree()))),selected=" ")
        })
        
        output$Select <- renderUI({
          
          Variable1 <- input$Variable1
          Donnees <- donnees_entree()
          validate(
            need(input$Variable1 !=" "  , "Choisir une variable")
          )
          
          if (class(Donnees[,Variable1])=="character" |
              class(Donnees[,Variable1])=="logical"){
            selectInput("Modalite1", "Modalité :",
                        choices=Choose_Field() , selected = NULL)  
          }
          else if (class(Donnees[,Variable1])=="integer" |
                   class(Donnees[,Variable1])=="numeric"){
            sliderInput("Modalite1", "Modalité :",
                        min=min(Donnees[,Variable1], na.rm=T),
                        max=max(Donnees[,Variable1], na.rm=T), round=1, step=.5, value=0)
          }
        })
        
        output$SelectVar2 <- renderUI ({
          
          selectInput("Variable2", "Variable :",
                      choices=as.list(c(" ",names(donnees_entree()))),selected=" ")
        })
        
        output$Select2 <- renderUI({
          Variable2 <- input$Variable2
          Donnees <- donnees_entree()
          
          
          validate(
            need(input$Variable2 !=" "  , "Choisir une variable")
          )
          if (class(Donnees[,Variable2])=="character" |
              class(Donnees[,Variable2])=="logical"){
            selectInput("Modalite2", "Modalité :",
                        choices=Choose_Field2() , selected = NULL)  
          }
          else if (class(Donnees[,Variable2])=="integer" |
                   class(Donnees[,Variable2])=="numeric"){
            sliderInput("Modalite2", "Modalité :",
                        min=min(Donnees[,Variable2], na.rm=T),
                        max=max(Donnees[,Variable2], na.rm=T), round=1, step=.5, value=0)
          }
        })
        
        output$SelectVar3 <- renderUI ({
          selectInput("Variable3", "Variable :",
                      choices=as.list(c(" ",names(donnees_entree()))),selected=" ")
        })
        
        output$Select3 <- renderUI({
          
          validate(
            need(input$Variable3 !=" "  , "Choisir une variable")
          )
          Variable3 <- input$Variable3
          Donnees <- donnees_entree()
          if(is.null(input$Variable3)) return(NULL)
          if (class(Donnees[,Variable3])=="character" |
              class(Donnees[,Variable3])=="logical"){
            selectInput("Modalite3", "Modalité :",
                        choices=Choose_Field3() , selected = NULL)  
          }
          else if (class(Donnees[,Variable3])=="integer" |
                   class(Donnees[,Variable3])=="numeric"){
            sliderInput("Modalite3", "Modalité :",
                        min=min(Donnees[,Variable3], na.rm=T),
                        max=max(Donnees[,Variable3], na.rm=T), round=1, step=.5, value=0)
          }
        })
        
        output$SelectVar4<- renderUI ({
          selectInput("Variable4", "Variable :",
                      choices=as.list(c(" ",names(donnees_entree()))),selected=" ")
        })
        
        output$Select4 <- renderUI({
          
          Variable4 <- input$Variable4
          Donnees <- donnees_entree()
          
          validate(
            need(input$Variable4 !=" "  , "Choisir une variable")
          )
          
          
          if (class(Donnees[,Variable4])=="character" |
              class(Donnees[,Variable4])=="logical"){
            selectInput("Modalite4", "Modalité :",
                        choices=Choose_Field4() , selected = NULL)  
          }
          else if (class(Donnees[,Variable4])=="integer" |
                   class(Donnees[,Variable4])=="numeric"){
            sliderInput("Modalite4", "Modalité :",
                        min=min(Donnees[,Variable4], na.rm=T),
                        max=max(Donnees[,Variable4], na.rm=T), round=1, step=.5, value=0)
          }
        })
        output$SelectNbreAxes <- renderUI({
          
          ACM <- ACM()
          Max <- nrow(ACM$eig)
          
          sliderInput("NbreAxes", "Nombre d'axes à afficher :", min=1, max = Max, value=ifelse(Max < 11, Max, 10), step=1)
        })
        
        # B/ Création de la table selon les sous-ensembles définis ----------------
        #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        
        
        Critere1 <- reactive({
          Var1 <- input$Variable1
          Moda1 <- input$Modalite1
          BiosFinal <- donnees_entree2()
          BiosFinal<-  switch(input$Operateur1,
                              " " = BiosFinal,
                              "=" =  BiosFinal[BiosFinal[,Var1] == Moda1,], 
                              "diff. de" =  BiosFinal[BiosFinal[,Var1] != Moda1,],
                              ">" = BiosFinal[BiosFinal[,Var1] > Moda1,],
                              ">=" = BiosFinal[BiosFinal[,Var1] >= Moda1,],
                              "<" = BiosFinal[BiosFinal[,Var1] < Moda1,],
                              "<=" = BiosFinal[BiosFinal[,Var1] <= Moda1,])
          BiosFinal <- BiosFinal[!(str_detect(row.names(BiosFinal),"NA")),] 
        })
        
        Critere2 <- reactive({
          Var2 <- input$Variable2
          Moda2 <- input$Modalite2
          BiosFinal <- donnees_entree2()
          BiosFinal <- switch(input$Operateur2,
                              " " = BiosFinal,
                              "=" =  BiosFinal[BiosFinal[,Var2] == Moda2,], 
                              "diff. de" =  BiosFinal[BiosFinal[,Var2] != Moda2,],
                              ">" = BiosFinal[BiosFinal[,Var2] > Moda2,],
                              ">=" = BiosFinal[BiosFinal[,Var2] >= Moda2,],
                              "<" = BiosFinal[BiosFinal[,Var2] < Moda2,],
                              "<=" = BiosFinal[BiosFinal[,Var2] <= Moda2,])
          BiosFinal <- BiosFinal[!(str_detect(row.names(BiosFinal),"NA")),] 
        })
        
        Critere3 <- reactive({
          Var3 <- input$Variable3
          Moda3 <- input$Modalite3
          BiosFinal <- donnees_entree2()
          BiosFinal<- switch(input$Operateur3,
                             " " = BiosFinal,
                             "=" =  BiosFinal[BiosFinal[,Var3] == Moda3,], 
                             "diff. de" =  BiosFinal[BiosFinal[,Var3] != Moda3,],
                             ">" = BiosFinal[BiosFinal[,Var3] > Moda3,],
                             ">=" = BiosFinal[BiosFinal[,Var3] >= Moda3,],
                             "<" = BiosFinal[BiosFinal[,Var3] < Moda3,],
                             "<=" = BiosFinal[BiosFinal[,Var3] <= Moda3,])
          BiosFinal <- BiosFinal[!(str_detect(row.names(BiosFinal),"NA")),] 
        })
        
        Critere4 <- reactive({
          Var4 <- input$Variable4
          Moda4 <- input$Modalite4
          BiosFinal <- donnees_entree2()
          BiosFinal<- switch(input$Operateur4,
                             " " = BiosFinal,
                             "=" =  BiosFinal[BiosFinal[,Var4] == Moda4,], 
                             "diff. de" =  BiosFinal[BiosFinal[,Var4] != Moda4,],
                             ">" = BiosFinal[BiosFinal[,Var4] > Moda4,],
                             ">=" = BiosFinal[BiosFinal[,Var4] >= Moda4,],
                             "<" = BiosFinal[BiosFinal[,Var4] < Moda4,],
                             "<=" = BiosFinal[BiosFinal[,Var4] <= Moda4,])
          BiosFinal <- BiosFinal[!(str_detect(row.names(BiosFinal),"NA")),] 
        })
        
        
        test <- reactive({
          Critere1 <- Critere1()
          Critere2 <- Critere2()
          ID <- input$ID
          Crit <- data.frame(Critere2[,ID]) 
          
          names(Crit)[1]<- ID
          don<-switch(input$OperateurMid,
                      " " = Critere1,
                      "OU" =  unique(rbind(Critere1, Critere2)), 
                      "ET" =  {
                        Critere1$tempProdACMVariableImprobable <- rownames(Critere1)
                        testC <- merge(Critere1, Crit, by=ID)
                        rownames(testC) <- testC$tempProdACMVariableImprobable
                        testC$tempProdACMVariableImprobable <- NULL
                        testC
                      }
                      # unique(merge(Critere1, Crit, by=ID))
          )
          
        })
        test2 <- reactive({
          Critere3 <- Critere3()
          Critere2 <- test()
          ID <- input$ID
          Crit <- data.frame(Critere3[,ID])
          names(Crit)[1]<- ID
          switch(input$OperateurMid2,
                 " " = Critere2,
                 "OU" =  unique(rbind(Critere3, Critere2)), 
                 "ET" =  {
                   Critere2$tempProdACMVariableImprobable <- rownames(Critere2)
                   testC <- merge(Critere2, Crit, by=ID)
                   rownames(testC) <- testC$tempProdACMVariableImprobable
                   testC$tempProdACMVariableImprobable <- NULL
                   testC
                 }
                 #unique(merge(Critere2, Crit, by=ID))
          )
        })
        
        
        test3 <- reactive({
          Critere4 <- Critere4()
          Critere3 <- test2()
          ID <- input$ID
          
          Crit <- data.frame(Critere4[,ID])
          
          names(Crit)[1]<- ID
          switch(input$OperateurMid3,
                 " " = Critere3,
                 "OU" =  unique(rbind(Critere4, Critere3)), 
                 "ET" =  {
                   Critere3$tempProdACMVariableImprobable <- rownames(Critere3)
                   testC <- merge(Critere3, Crit, by=ID)
                   rownames(testC) <- testC$tempProdACMVariableImprobable
                   testC$tempProdACMVariableImprobable <- NULL
                   testC
                 } 
                 #  unique(merge(Critere3, Crit, by=ID))
          )
          
          
        })
        
        test4 <- reactive({
          test3 <- test3()
          VariableTri <- input$VariableTri
          
          test4 <- test3
          test4[,VariableTri] <- switch(input$ChangementVarTri,
                                        "Pas de modification" = test4[,VariableTri] ,
                                        "Qualitative" = as.character ( test4[,VariableTri]),
                                        "Quantitative" =  as.numeric (test4[,VariableTri]),
                                        "Logique" = as.logical (test4[,VariableTri]))
          test4 <- test4[!(str_detect(row.names(test4),"NA")),]
          
          
        })
        
        
        # C/ Création de la table pour l'ACM selon les variables conservées dans le modèle ----
        #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        
        
        # Définition des variables illustratives :
        
        VarsIllus <- reactive({
          VarsIllus <- input$VarIllusPourACM
          TableACM <- TableACM()
          c<-which(as.list(names(TableACM))== VarsIllus[1])
          if (length(VarsIllus)<2){
            c<-which(as.list(names(TableACM))== VarsIllus[1])
          }else{
            c<-which(as.list(names(TableACM))== VarsIllus[1])
            #if (length(VarsIllus>1))
            for (i in 2:length(VarsIllus)) {
              c <- c(c, which(as.list(names(TableACM))== VarsIllus[i]))
            }
          }
          c
        })
        
        
        VarsIllusQuanti <- reactive({
          VarsIllusQuanti <- input$VarIllusQuantiPourACM
          TableACM <- TableACM()
          c<-which(as.list(names(TableACM))== VarsIllusQuanti[1])
          if (length(VarsIllusQuanti)<2){
            c<-which(as.list(names(TableACM))== VarsIllusQuanti[1])
          }else{
            c<-which(as.list(names(TableACM))== VarsIllusQuanti[1])
            #if (length(VarsIllusQuanti>1))
            for (i in 2:length(VarsIllusQuanti)) {
              c <- c(c, which(as.list(names(TableACM))== VarsIllusQuanti[i]))
            }
          }
          c
        })
        
        
        
        Illus <- reactive({
          VarsIllus <- VarsIllus()
          if (length(VarsIllus)<1) {
            test <- ""
          }else{
            d <- paste("c(",VarsIllus[1], sep="")
            if (length(VarsIllus)<2){
              test <- paste(d, ")", sep="")
            }else{
              for (i in 2:length(VarsIllus)) {
                d <- paste(d,",",VarsIllus[i], sep="")
              }
              test <- paste(d, ")", sep="")
            }
          }
          Illus<-  test
          Illus
        })
        IllusQuanti <- reactive({
          VarsIllusQuanti <- VarsIllusQuanti()
          if (length(VarsIllusQuanti)<1) {
            test <- ""
          }else{
            d <- paste("c(",VarsIllusQuanti[1], sep="")
            if (length(VarsIllusQuanti)<2){
              test <- paste(d, ")", sep="")
              
            }else{
              for (i in 2:length(VarsIllusQuanti)) {
                d <- paste(d,",",VarsIllusQuanti[i], sep="")
              }
              test <- paste(d, ")", sep="")
            }
          }
          IllusQuanti<-  test
          IllusQuanti
        })
        
        
        
        # Selection de la variable pour tri à plat :
        
        output$SelectVarTri <- renderUI ({
          ID <- input$ID
          if (ID == " ") {return ("")} else {
            
            selectInput("VariableTri", "Variable :",
                        choices=as.list(c(" ",names(test3()))),selected=" ")
          }
        })
        
        
        TypeVarTri <- reactive({
          
          Donnees <- test4()
          VariableTri <-  input$VariableTri
          class(Donnees[,VariableTri])
        })
        
        output$TypeVarTri <- renderText({
          
          
          ## Validations / erreurs 
          validate(
            need(nrow(donnees_entree())!=0, "")
          )
          validate(
            need(input$ID!= " ", "")
          )
          validate(
            need(input$VariableTri!= " ", "")
          )
          
          ## Contenu
          
          TypeVarTri()
        })
        
        
        output$TableVarTri <- renderTable({
          
          ## Validations / erreurs 
          validate(
            need(nrow(donnees_entree())!=0, "Charger une table (onglet 1)")
          )
          
          
          validate(
            need(input$ID!= " ", "Sélectionner un identifiant (onglet 1)")
          )
          
          
          validate(
            need(input$VariableTri!= " ", "Sélectionner une variable")
          )
          
          ## Données
          Donnees <- test4()
          VariableTri <-  input$VariableTri
          
          ## Contenu
          if (class(Donnees[,VariableTri])=="character" |
              class(Donnees[,VariableTri])=="logical"){
            t<- freq(Donnees[,VariableTri], sort="dec",total = T) 
            t$Modalites <- row.names(t)
            t <- t[,c(4,1:3)]
            t
          }
          else if (class(Donnees[,VariableTri])=="integer" |
                   class(Donnees[,VariableTri])=="numeric"){
            
            t <- Donnees %>% 
              dplyr::summarise (Min = min(eval(parse(text=VariableTri)), na.rm= T), 
                                Quartile1 = quantile(eval(parse(text=VariableTri)), .25, na.rm = T),
                                Mediane = median(eval(parse(text=VariableTri)), na.rm = T),
                                Moyenne = round(mean(eval(parse(text=VariableTri)), na.rm = T),1), 
                                Quartile3 = quantile(eval(parse(text=VariableTri)), .75, na.rm = T),
                                Max = max(eval(parse(text=VariableTri)), na.rm = T), 
                                NbreNA = sum(is.na(eval(parse(text=VariableTri)))))
            t
          }
          
        })
        
        
        # Table pour l'ACM :
        
        TableACM <- reactive({
          validate(
            need(length(input$VarPourACM)>1, " ")
          )
          Vars <- input$VarPourACM
          VarQuanti <- input$VarIllusQuantiPourACM
          BiosFinal <- test3()
          TableACM <- data.frame(BiosFinal[,Vars])
          for (i in 1:ncol(TableACM)) {
            TableACM[,i] <- factor(TableACM[,i])
          }
          if (length(VarQuanti)==0) {
            TableACM <- TableACM
          } else{
            for (i in 1:length(VarQuanti)){
              TableACM[,unlist(VarQuanti)[i]] <- as.numeric(TableACM[,unlist(VarQuanti)[i]])
            }
          }
          TableACM
          
        })
        
        
        # D/ Résultat de l'ACM  ------------
        #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        
        ACM <- reactive({
          tmp<-TableACM()
          Illus <- Illus()
          IllusQuanti <- IllusQuanti()
          ListeModaSpe <- ListeModaSpe()
          #  ACMSpe <- input$ACMSpe
          #  if (ACMSpe == TRUE) {
          #    ACM <- GDAtools::speMCA(tmp)
          #  } else {
          
          ACM <- MCA(tmp, quali.sup =  eval(parse(text=Illus)), ncp=100,
                     quanti.sup=eval(parse(text=IllusQuanti)), graph = F)
          #    }
          ACM
          
        })
        
        
        # Préparation des données pour les représentations :
        res <- reactive({
          ACMSpe <- input$ACMSpe
          ACM <- ACM()
          
          #  if (ACMSpe == TRUE) {
          #   res <- explor::prepare_results.speMCA(ACM)
          # } else {
          res <- explor::prepare_results(ACM)
          # }
        })
        
        # Choix pour la classification ---------------
        
        output$NbAxes.Cl.Choix <- renderUI({
          Type.Cl <- input$Type.Cl
          ACM <- ACM()
          Max <- nrow(ACM$eig)
          if (Type.Cl == "Hiérarchique"){
            sliderInput("NbAxes.Cl", label = "1. Nombre d'axes à inclure (max = nbre d'axes total, limité à 100)", min = 1, 
                        max = Max, value = ifelse(Max < 11, Max, 10), step=1)}
          
        })
        
        output$Metric.Cl.Choix <- renderUI({
          Type.Cl <- input$Type.Cl
          if (Type.Cl == "Hiérarchique"){
            selectInput("Metric.Cl", "2. Choix de la métrique",
                        choices=as.list(c("euclidienne","manhattan")),
                        selected="euclidienne")
          }
        })
        
        output$Agreg.Cl.Choix <- renderUI({
          Type.Cl <- input$Type.Cl
          if (Type.Cl == "Hiérarchique"){
            selectInput("Agreg.Cl", "3. Critère d'agrégation",
                        choices=as.list(c("saut minimum","diamètre","moyennes","ward")),
                        selected="ward")
          }
        })
        
        output$Part.H.Cl.Choix <- renderUI({
          Type.Cl <- input$Type.Cl
          if (Type.Cl == "Hiérarchique"){
            selectInput("Part.H.Cl", "4. Type de partition",
                        choices=as.list(c("ascendante","descendante")),
                        selected="ascendante")
          }
        })
        
        
        output$NbreCl.Cl.Choix <- renderUI({
          Type.Cl <- input$Type.Cl
          if (Type.Cl == "Hiérarchique"){
            
            numericInput("NbreClasses","5. Nombre classes résultantes",5)
          }    
          else if (Type.Cl == "Pas de classification"){
            
            numericInput("NbreClasses","5. Nombre classes résultantes",1)
          }
        })
        
        
        
        
        # Résultation de la classification ---------------
        
        
        # Arbre selon le nbre de classes :
        cahTree <- reactive({
          ACM <- ACM()
          NbAxes.Cl <- input$NbAxes.Cl
          NbreClasses <- input$NbreClasses
          Metric.Cl <- switch(input$Metric.Cl,
                              "euclidienne"="euclidean",
                              "manhattan"= "manhattan")
          Agreg.Cl <- switch(input$Agreg.Cl,
                             "saut minimum" = "single",
                             "diamètre"="complete",
                             "moyennes"="average",
                             "ward"="ward")
          agnes(ACM$ind$coord[,1:NbAxes.Cl], method = Agreg.Cl, metric=Metric.Cl) 
        })
        
        DataClust <- reactive({
          # On veut : Noms + Classes
          Donnees <- test3()
          cahTree <- cahTree()
          NbreClasses <- input$NbreClasses
          Agnes.Cl <- cutree(cahTree, k=NbreClasses)
          # Agnes.Cl.vect <- factor(Agnes.Cl,labels=paste('classe',1:NbreClasses, sep=' '))
          
          DataClust <- data.frame(Name=rownames(cahTree$data), clust= cutree(cahTree, k=NbreClasses), stringsAsFactors = F)
          # DataClust <- data.frame(Name=rownames(cahTree$data), clust=Agnes.Cl.vect, stringsAsFactors = F)
          
          DataClust$clust <- as.character(DataClust$clust)
          
          # DataClust <-data.frame(Agnes.Cl.vect)
          # rownames (DataClust) <- rownames(Donnees)
          # colnames(DataClust) <- "clust"
          # DataClust$Name <- rownames(DataClust)
          # 
          
          DataClust
          
          
        })
        
        # E/ EN SORTIE : Tables et graphiques -----------
        #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        
        
        # Table des types de variables conservées pour l'ACM :
        
        output$Type <- renderTable({
          tmp <- TableACM()
          
          VarQuanti <- input$VarIllusQuantiPourACM
          
          Var <- input$VarIllusPourACM
          
          validate(
            need(length(input$VarPourACM)>0 , "Choisir au moins 2 variables pour l'ACM")
          )
          
          
          Type <-  data.frame( Variable = names(tmp[1]),
                               Type = class(tmp[,1]))
          for (i in (2:ncol(tmp))) {
            Type<-rbind(Type, data.frame( Variable = names(tmp[i]),
                                          Type = class(tmp[,i])))
          }
          
          Type$StatutACM <- "Active"
          if (length(Var)==0) {Type <- Type}else{
            for (i in (1:nrow(Type))){
              for (j in (1:length(Var))) {
                if (Type$Variable[i]==unlist(Var)[j]){
                  Type$StatutACM[i] <- "Supplémentaire"
                }}}
          }
          
          if (length(VarQuanti)==0) {Type <- Type }else{
            for (i in (1:nrow(Type))){
              for (j in (1:length(VarQuanti))) {
                if (Type$Variable[i]==unlist(VarQuanti)[j]){
                  Type$StatutACM[i] <- "Supplémentaire"
                }}}
          }
          
          
          Type
        })
        
        #  Valeurs propres :
        
        output$ValeursPropres<-renderTable({
          NbreAxes <- input$NbreAxes
          ACM <- ACM()
          ACMSpe <- input$ACMSpe
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          
          # if (ACMSpe == TRUE) {
          
          #  ValeursPropres <- data.frame (var=round(ACM$eig[,"rate"],digits=1),
          #                                VarCumulee=round(ACM$eig[,"cum.rate"],digits=1))
          #  ValeursPropres$Axe <- row.names(ValeursPropres)
          #  ValeursPropres <- ValeursPropres[,c(3,1,2)]
          #  ValeursPropres <- ValeursPropres[1:NbreAxes,]
          #  ValeursPropres[,1] <- paste("dim",ValeursPropres[,1], " ")
          #  row.names(ValeursPropres) <- ValeursPropres[,1]
          
          
          # } else {
          ValeursPropres <- data.frame (Axe= row.names(ACM$eig),
                                        var=round(ACM$eig[,"percentage of variance"],digits=1),
                                        VarCumulee=round(ACM$eig[,"cumulative percentage of variance"],digits=1))
          ValeursPropres <- ValeursPropres[1:NbreAxes,]
          #  }
        })
        
        # Graphes des valeurs propres :
        
        output$Variance <- renderPlot({
          ACM <- ACM()
          
          NbreAxes <- input$NbreAxes
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          
          Val10 <- data.frame (Axe= row.names(ACM$eig),
                               var=round(ACM$eig[,"percentage of variance"],digits=1),
                               VarCumulee=round(ACM$eig[,"cumulative percentage of variance"],digits=1))
          Val10<- Val10[1:NbreAxes,]
          
          Val10 <- arrange (Val10,  desc(var))
          Val10$Axe <- factor(Val10$Axe,
                              levels = Val10$Axe[order(Val10$VarCumulee)])
          ggplot(Val10, aes(x=Axe, y=var))+geom_bar(stat="identity")+
            ggtitle("Variance")+labs(y="Variance (%)")
        })
        
        output$VarianceCum <- renderPlot({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          
          ACM <- ACM()
          
          NbreAxes <- input$NbreAxes
          Val10 <- data.frame (Axe= row.names(ACM$eig),
                               var=round(ACM$eig[,"percentage of variance"],digits=1),
                               VarCumulee=round(ACM$eig[,"cumulative percentage of variance"],digits=1))
          Val10<- Val10[1:NbreAxes,]
          
          Val10 <- arrange (Val10,  desc(var))
          Val10$Axe <- factor(Val10$Axe,
                              levels = Val10$Axe[order(Val10$VarCumulee)])
          ggplot(Val10, aes(x=Axe, y=var))+geom_bar(stat="identity")+
            ggtitle("Variance")+labs(y="Variance (%)")
          ggplot(Val10, aes(x=Axe, y=VarCumulee))+geom_bar(stat="identity")+
            ggtitle("Variance cumulée")+labs(y="Variance cumulée (%)")
        })
        
        # Graphiques des variables : 
        
        output$GraphVarAxeA <- renderScatterD3({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          res <-res()
          ACM <- ACM()
          VarAxeA <- input$VarAxeA
          Graphiques1 <- explor::prepare_results(ACM)
          MaxCoord1 <- round(max(ACM$var$coord[,VarAxeA]), digits=2)
          MinCoord1 <- round(min(ACM$var$coord[,VarAxeA]), digits=2)
          vars <-Graphiques1$vars[Graphiques1$vars[,"Axis"]==VarAxeA,] 
          ind <-Graphiques1$ind[Graphiques1$ind[,"Axis"]==VarAxeA,] 
          eig <- Graphiques1$eig[Graphiques1$eig[,"dim"]==VarAxeA,]
          vareta2<-Graphiques1$vareta2
          quali_data <- Graphiques1$quali_data
          
          
          Graphiques1 <- list("vars"=vars, "ind"=ind, "eig"=eig,"axes"=as.integer(1), 
                              "vareta2"=vareta2,"quali_data"=quali_data)
          
          Graphiques1$vars <- Graphiques1$vars[Graphiques1$vars$Type == "Active",]
          
          Graphiques1$vars <- dplyr::arrange (Graphiques1$vars, Variable)
          
          scatterD3::scatterD3(data = Graphiques1$vars, x = Coord, y = Axis, fixed = F,
                               ylim = c(VarAxeA-.1,VarAxeA+.1) ,
                               xlim = c(MinCoord1-.5, MaxCoord1+.5),
                               col_var =  Variable, legend_width = F)
        })
        
        
        
        output$GraphVarAxeB <- renderScatterD3({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          res <-res()
          ACM <- ACM()
          Graphiques1 <- explor::prepare_results(ACM)
          VarAxeB <- input$VarAxeB
          MaxCoord1 <- round(max(ACM$var$coord[,VarAxeB]), digits=2)
          MinCoord1 <- round(min(ACM$var$coord[,VarAxeB]), digits=2)
          vars <-Graphiques1$vars[Graphiques1$vars[,"Axis"]==VarAxeB,] 
          ind <-Graphiques1$ind[Graphiques1$ind[,"Axis"]==VarAxeB,] 
          eig <- Graphiques1$eig[Graphiques1$eig[,"dim"]==VarAxeB,]
          vareta2<-Graphiques1$vareta2
          quali_data <- Graphiques1$quali_data
          
          
          Graphiques1 <- list("vars"=vars, "ind"=ind, "eig"=eig,"axes"=as.integer(1), 
                              "vareta2"=vareta2,"quali_data"=quali_data)
          
          Graphiques1$vars <- Graphiques1$vars[Graphiques1$vars$Type == "Active",]
          Graphiques1$vars <- dplyr::arrange (Graphiques1$vars, Variable)
          
          scatterD3::scatterD3(data = Graphiques1$vars, x = Axis, y = Coord, fixed = F,
                               ylim = c(MinCoord1-.5, MaxCoord1+.5),
                               xlim = c(VarAxeB-.1, VarAxeB+.1) ,
                               col_var =  Variable, legend_width = F)
        })
        
        
        output$GraphVar <- renderScatterD3({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          
          res <-res()
          ACM <- ACM()
          MinContribVar1 <- input$MinContribVar1
          VarAxeA <- input$VarAxeA
          VarAxeB <- input$VarAxeB
          MaxCoord1 <- round(max(ACM$var$coord[,VarAxeA]), digits=2)
          MinCoord1 <- round(min(ACM$var$coord[,VarAxeA]), digits=2)
          MaxCoord2 <- round(max(ACM$var$coord[,VarAxeB]), digits=2)
          MinCoord2 <- round(min(ACM$var$coord[,VarAxeB]), digits=2)
          GraphVar<- explor::MCA_var_plot(res, xax = VarAxeA, yax = VarAxeB,
                                          var_sup = TRUE, var_lab_min_contrib = MinContribVar1,
                                          col_var = "Variable", symbol_var = "Type",
                                          size_var = "Contrib", size_range = c(52.5, 700),
                                          labels_size = 12, point_size = 56,
                                          transitions = TRUE, labels_positions = NULL,
                                          xlim = c(MinCoord1-.5, MaxCoord1+.5),
                                          ylim = c(MinCoord2-.5, MaxCoord2+.5)) 
        })
        
        
        
        output$GraphVarAxeC <- renderScatterD3({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          res <-res()
          ACM <- ACM()
          VarAxeC <- input$VarAxeC
          Graphiques1 <- explor::prepare_results(ACM)
          MaxCoord1 <- round(max(ACM$var$coord[,VarAxeC]), digits=2)
          MinCoord1 <- round(min(ACM$var$coord[,VarAxeC]), digits=2)
          vars <-Graphiques1$vars[Graphiques1$vars[,"Axis"]==VarAxeC,] 
          ind <-Graphiques1$ind[Graphiques1$ind[,"Axis"]==VarAxeC,] 
          eig <- Graphiques1$eig[Graphiques1$eig[,"dim"]==VarAxeC,]
          vareta2<-Graphiques1$vareta2
          quali_data <- Graphiques1$quali_data
          
          
          Graphiques1 <- list("vars"=vars, "ind"=ind, "eig"=eig,"axes"=as.integer(1), 
                              "vareta2"=vareta2,"quali_data"=quali_data)
          
          Graphiques1$vars <- Graphiques1$vars[Graphiques1$vars$Type == "Active",]
          
          Graphiques1$vars <- dplyr::arrange (Graphiques1$vars, Variable)
          
          scatterD3::scatterD3(data = Graphiques1$vars, x = Coord, y = Axis, fixed = F,
                               ylim = c(VarAxeC-.1,VarAxeC+.1) ,
                               xlim = c(MinCoord1-.5, MaxCoord1+.5),
                               col_var =  Variable, legend_width = F)
        })
        
        
        
        output$GraphVarAxeD <- renderScatterD3({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          res <-res()
          ACM <- ACM()
          Graphiques1 <- explor::prepare_results(ACM)
          VarAxeD <- input$VarAxeD
          MaxCoord1 <- round(max(ACM$var$coord[,VarAxeD]), digits=2)
          MinCoord1 <- round(min(ACM$var$coord[,VarAxeD]), digits=2)
          vars <-Graphiques1$vars[Graphiques1$vars[,"Axis"]==VarAxeD,] 
          ind <-Graphiques1$ind[Graphiques1$ind[,"Axis"]==VarAxeD,] 
          eig <- Graphiques1$eig[Graphiques1$eig[,"dim"]==VarAxeD,]
          vareta2<-Graphiques1$vareta2
          quali_data <- Graphiques1$quali_data
          
          
          Graphiques1 <- list("vars"=vars, "ind"=ind, "eig"=eig,"axes"=as.integer(1), 
                              "vareta2"=vareta2,"quali_data"=quali_data)
          
          Graphiques1$vars <- Graphiques1$vars[Graphiques1$vars$Type == "Active",]
          Graphiques1$vars <- dplyr::arrange (Graphiques1$vars, Variable)
          
          scatterD3::scatterD3(data = Graphiques1$vars, x = Axis, y = Coord, fixed = F,
                               ylim = c(MinCoord1-.5, MaxCoord1+.5),
                               xlim = c(VarAxeD-.1, VarAxeD+.1) ,
                               col_var =  Variable, legend_width = F)
        })
        
        
        
        output$GraphVar2 <- renderScatterD3({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          
          res <-res()
          ACM <- ACM()
          MinContribVar2 <- input$MinContribVar2
          VarAxeC <- input$VarAxeC
          VarAxeD <- input$VarAxeD
          MaxCoord3 <- round(max(ACM$var$coord[,VarAxeC]), digits=2)
          MinCoord3 <- round(min(ACM$var$coord[,VarAxeC]), digits=2)
          MaxCoord4 <- round(max(ACM$var$coord[,VarAxeD]), digits=2)
          MinCoord4 <- round(min(ACM$var$coord[,VarAxeD]), digits=2)
          GraphVar<- explor::MCA_var_plot(res, xax = VarAxeC, yax = VarAxeD,
                                          var_sup = TRUE, var_lab_min_contrib = MinContribVar2,
                                          col_var = "Variable", symbol_var = "Type",
                                          size_var = "Contrib", size_range = c(52.5, 700),
                                          labels_size = 12, point_size = 56,
                                          transitions = TRUE, labels_positions = NULL,
                                          xlim = c(MinCoord3-.5, MaxCoord3+.5),
                                          ylim = c(MinCoord4-.5, MaxCoord4+.5)) 
          GraphVar
        })
        
        # Tables des variables :
        
        TableVar <- reactive({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          
          ACM <- ACM()
          AxeVar1 <- input$AxeVar1
          ContribVar1 <- input$ContribVar1
          Contrib <- data.frame ( Var=row.names(ACM$var$contrib),
                                  Contrib=round(ACM$var$contrib[,AxeVar1],digits=1),
                                  Coord=round(ACM$var$coord[,AxeVar1],digits=1),
                                  Cos2=round(ACM$var$cos2[,AxeVar1],digits=1))
          Contrib <- arrange(Contrib, desc(Contrib))
          Contrib[(Contrib$Contrib>ContribVar1)  ,]
        }
        
        )
        output$TableVar <- renderDataTable({
          
          validate(
            need(length(input$VarPourACM)>1, "")
          )
          
          TableVar <- TableVar()
          datatable(TableVar,options = list(pageLength = 20))  
        })
        TableVar2 <- reactive({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          
          ACM <- ACM()
          AxeVar2 <- input$AxeVar2
          ContribVar2 <- input$ContribVar2
          Contrib <- data.frame ( Var=row.names(ACM$var$contrib),
                                  Contrib=round(ACM$var$contrib[,AxeVar2],digits=1),
                                  Coord=round(ACM$var$coord[,AxeVar2],digits=1),
                                  Cos2=round(ACM$var$cos2[,AxeVar2],digits=1))
          Contrib <- arrange(Contrib, desc(Contrib))
          Contrib[(Contrib$Contrib>ContribVar2)  ,]
        })
        output$TableVar2 <- renderDataTable({
          
          validate(
            need(length(input$VarPourACM)>1, "")
          )
          
          TableVar2 <- TableVar2()
          datatable(TableVar2,options = list(pageLength = 20))
          
        })  
        
        # Graphiques des individus
        
        output$GraphInd <- renderScatterD3({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          
          res <-res()
          #   cah <- cah()
          ACM <- ACM()
          IndAxe1 <- input$IndAxe1
          IndAxe2 <- input$IndAxe2
          MaxCoord1 <- max(ACM$ind$coord[,IndAxe1])
          MinCoord1 <- min(ACM$ind$coord[,IndAxe1])
          MaxCoord2 <- max(ACM$ind$coord[,IndAxe2])
          MinCoord2 <- min(ACM$ind$coord[,IndAxe2])
          MinContrib1 <- input$MinContrib1
          NbreClasses <- input$NbreClasses
          Ellipse <- input$Ellipse
          VarClassesGraphe <- input$VarClassesGraphe
          ID <- input$ID
          TableACM <- test3()
          data.clust <- DataClust()
          
          if (VarClassesGraphe!=" "){
            
            TableACM$Name <- rownames(TableACM)
            TableACM$Name <- as.character(TableACM$Name)
            res$quali_data <- merge( res$quali_data, TableACM[,c("Name",VarClassesGraphe)], by="Name", all.x=T)
            names(res$quali_data) <- gsub("\\.y", "", names(res$quali_data))
            GraphInd <- MCA_ind_plot(res, xax = IndAxe1, yax = IndAxe2,ind_sup = FALSE, ind_lab_min_contrib = MinContrib1,
                                     col_var = VarClassesGraphe, lab_var = "Name", labels_size = 12,
                                     point_opacity = 0.5, opacity_var = "Contrib", point_size = 64,
                                     ellipses = Ellipse, transitions = TRUE, labels_positions = NULL,
                                     xlim = c(MinCoord1-.25, MaxCoord1+.25),
                                     ylim = c(MinCoord2-.25, MaxCoord2+.25))
            
          } else {
            if (NbreClasses==1){
              GraphInd <- MCA_ind_plot(res, xax = IndAxe1, yax = IndAxe2,ind_sup = FALSE, ind_lab_min_contrib = MinContrib1,
                                       lab_var = "Name", labels_size = 12,
                                       point_opacity = 0.5, opacity_var = "Contrib", point_size = 64,
                                       ellipses = Ellipse, transitions = TRUE, labels_positions = NULL,
                                       xlim = c(MinCoord1-.25, MaxCoord1+.25),
                                       ylim = c(MinCoord2-.25, MaxCoord2+.25))
            } else {
              res$quali_data <- merge(res$quali_data, data.clust[,c("Name","clust")], by="Name", all.x=T)
              
              GraphInd <- MCA_ind_plot(res, xax = IndAxe1, yax = IndAxe2,ind_sup = FALSE, ind_lab_min_contrib = MinContrib1,
                                       col_var = "clust", lab_var = "Name", labels_size = 12,
                                       point_opacity = 0.5, opacity_var = "Contrib", point_size = 64,
                                       ellipses = Ellipse, transitions = TRUE, labels_positions = NULL,
                                       xlim = c(MinCoord1-.25, MaxCoord1+.25),
                                       ylim = c(MinCoord2-.25, MaxCoord2+.25))
            }
          }
          
          
          GraphInd
        })
        
        
        output$GraphInd2 <- renderScatterD3({
          
          validate(
            need(length(input$VarPourACM)>1, "Choisir au moins 2 variables pour l'ACM")
          )
          
          res <-res()
          #  cah <- cah()
          MinContrib2 <- input$MinContrib2
          
          ACM <- ACM()
          IndAxe3 <- input$IndAxe3
          IndAxe4 <- input$IndAxe4
          MaxCoord3 <- max(ACM$ind$coord[,IndAxe3])
          MinCoord3 <- min(ACM$ind$coord[,IndAxe3])
          MaxCoord4 <- max(ACM$ind$coord[,IndAxe4])
          MinCoord4 <- min(ACM$ind$coord[,IndAxe4])
          NbreClasses <- input$NbreClasses
          Ellipse2 <- input$Ellipse2
          VarClassesGraphe <- input$VarClassesGraphe
          ID <- input$ID
          TableACM <- test3()
          data.clust <- DataClust()
          
          if (VarClassesGraphe!=" "){
            
            TableACM$Name <- rownames(TableACM)
            TableACM$Name <- as.character(TableACM$Name)
            res$quali_data <- merge( res$quali_data, TableACM[,c("Name",VarClassesGraphe)], by="Name", all.x=T)
            names(res$quali_data) <- gsub("\\.y", "", names(res$quali_data))
            GraphInd2 <- MCA_ind_plot(res, xax = IndAxe3, yax = IndAxe4,ind_sup = FALSE, ind_lab_min_contrib = MinContrib2,
                                      col_var = VarClassesGraphe, lab_var = "Name", labels_size = 12,
                                      point_opacity = 0.5, opacity_var = "Contrib", point_size = 64,
                                      ellipses = Ellipse2, transitions = TRUE, labels_positions = NULL,
                                      xlim = c(MinCoord3-.25, MaxCoord3+.25),
                                      ylim = c(MinCoord4-.25, MaxCoord4+.25))
            
          } else {
            if (NbreClasses==1){
              GraphInd2 <- MCA_ind_plot(res, xax = IndAxe3, yax = IndAxe4,ind_sup = FALSE, ind_lab_min_contrib = MinContrib2,
                                        lab_var = "Name", labels_size = 12,
                                        point_opacity = 0.5, opacity_var = "Contrib", point_size = 64,
                                        ellipses = Ellipse2, transitions = TRUE, labels_positions = NULL,
                                        xlim = c(MinCoord3-.25, MaxCoord3+.25),
                                        ylim = c(MinCoord4-.25, MaxCoord4+.25))
            } else {
              res$quali_data <- merge(res$quali_data, data.clust[,c("Name","clust")], by="Name", all.x=T)
              
              GraphInd2 <- MCA_ind_plot(res, xax = IndAxe3, yax = IndAxe4,ind_sup = FALSE, ind_lab_min_contrib = MinContrib2,
                                        col_var = "clust", lab_var = "Name", labels_size = 12,
                                        point_opacity = 0.5, opacity_var = "Contrib", point_size = 64,
                                        ellipses = Ellipse2, transitions = TRUE, labels_positions = NULL,
                                        xlim = c(MinCoord3-.25, MaxCoord3+.25),
                                        ylim = c(MinCoord4-.25, MaxCoord4+.25))
            }
          }
          
          
          GraphInd2
        })
        
        
        # Tables des individus :
        
        TableInd <- reactive ({
          ACM <- ACM()
          AxeInd1 <- input$AxeInd1
          ContribInd1 <- input$ContribInd1
          
          Contrib <- data.frame ( Ind=row.names(ACM$ind$contrib),
                                  Contrib=round(ACM$ind$contrib[,AxeInd1],digits=1),
                                  Coord=round(ACM$ind$coord[,AxeInd1],digits=1),
                                  Cos2=round(ACM$ind$cos2[,AxeInd1],digits=1))
          Contrib <- arrange(Contrib, desc(Contrib))
          Contrib[(Contrib$Contrib>ContribInd1)  ,]
        })
        output$TableInd <- renderDataTable({
          TableInd <- TableInd()
          datatable(TableInd,options = list(pageLength = 20))
          
        })
        
        TableInd2 <- reactive ({
          ACM <- ACM()
          AxeInd2 <- input$AxeInd2
          ContribInd2 <- input$ContribInd2
          Contrib <- data.frame ( Ind=row.names(ACM$ind$contrib),
                                  Contrib=round(ACM$ind$contrib[,AxeInd2],digits=1),
                                  Coord=round(ACM$ind$coord[,AxeInd2],digits=1),
                                  Cos2=round(ACM$ind$cos2[,AxeInd2],digits=1))
          Contrib <- arrange(Contrib, desc(Contrib))
          Contrib[(Contrib$Contrib>ContribInd2)  ,]
        })
        output$TableInd2 <- renderDataTable({
          TableInd2 <- TableInd2()
          datatable(TableInd2,options = list(pageLength = 20))
          
        })  
        
        #  Classification
        
        output$plot <- renderPlot({
          cah <- cahTree()
          NbreClasses <- input$NbreClasses
          A2Rplot(cah,k=NbreClasses, col.up = "gray50", 
                  col.down = brewer.pal(NbreClasses, "Dark2"), show.labels = FALSE,boxes = FALSE)
        })
        
        output$plot3 <- renderPlot({
          cah <- cahTree()
          NbreClasses <- input$NbreClasses
          Max <-  ifelse(NbreClasses >5, NbreClasses*2, 10)
          tri <- data.frame(var=sort(cah$height[1:Max], decreasing = TRUE),
                            axe=seq(1,Max,1))
          tri$col <- ifelse(tri$axe <= NbreClasses, "1","2")
          tri$axe<-factor(tri$axe)
          
          ggplot(data=tri, aes(x=axe, y=var, fill=col))+geom_bar(stat="identity",
                                                                 colour="black")+
            labs(x="Nombre de classes", y="Inertie") +
            ggtitle("")+
            scale_fill_manual(values=c('brown4','grey'),
                              guide=FALSE)+
            theme_light()+theme(axis.text.x = element_text(angle=45, hjust=1, vjust=1,size=10),
                                axis.title=element_text(size=12,face="bold"),
                                axis.title.y=element_blank(),
                                axis.text.y=element_blank(),
                                legend.text=element_text(size=10),
                                title = element_text(size=12, face="bold"),
                                plot.title=element_text(hjust = 0.5))+theme(legend.position="none")
          
          
          
        })
        
        # Table des individus selon les groupes générés par la classifications
        
        IndEtClasses <- reactive({
          # cah <- cah()
          # cah$data.clust$Name <- row.names(cah$data.clust)
          data.clust <- DataClust()
          IndEtClasses <- data.frame (Noms = data.clust$Name ,
                                      Classes = data.clust$clust)
        })
        output$IndEtClasses <- renderDataTable({
          
          validate(
            need(nrow(donnees_entree())!=0, "")
          )
          validate(
            need(input$ID!= " ", "")
          )
          IndEtClasses <- IndEtClasses()
          
        })
        output$TableEffClasses <- renderTable({
          
          validate(
            need(nrow(donnees_entree())!=0, "")
          )
          validate(
            need(input$ID!= " ", "")
          )
          
          IndEtClasses <- IndEtClasses()
          t<- freq(IndEtClasses$Classes, total= T, cum = F)
          t$Classes <- row.names(t)
          t <- t[,c(4,1:2)]
          names(t) <- c("Classes","Effectifs","%")
          t
        })
        
        # Selection de la variable pour croisé avec les classes :
        
        output$SelectVarClasses <- renderUI ({
          
          ## Validations / erreurs :
          validate(
            need(nrow(donnees_entree())!=0, "")
          )
          
          
          validate(
            need(input$ID!= " ", "")
          )
          
          
          
          ## Contenu :
          
          selectInput("VariableClasses", "Variable :",
                      choices=as.list(c(" ",names(test3()))),selected=" ")
        })
        
        
        
        # Croisement classe et autre variable :
        
        IndEtTableDep <-  reactive ({
          
          ## Validations / erreurs :
          validate(
            need(nrow(donnees_entree())!=0, "")
          )
          
          
          validate(
            need(input$ID!= " ", "")
          )
          
          ## Contenu
          TableDep <- test3()
          IndEtClasses <- IndEtClasses()
          ID <- input$LabelGraphInd
          
          IndEtTableDep <- merge (TableDep, IndEtClasses,
                                  by.x = ID, by.y = "Noms",
                                  all.x= T)
        })  
        
        TableVarClasses <- reactive({
          
          
          IndEtTableDep <- IndEtTableDep()
          
          VariableClasses <-  input$VariableClasses
          validate(
            need(input$VariableClasses!=" " , "Choisir une variable")
          )
          
          if (class(IndEtTableDep[,VariableClasses])=="character" |
              class(IndEtTableDep[,VariableClasses])=="logical"){
            t<-data.frame(cprop(table(IndEtTableDep[,VariableClasses], 
                                      IndEtTableDep [,"Classes"])))
            t$Freq <- round(t$Freq, 2)
            t <- spread(t, "Var2","Freq")
            names(t)[1] <- VariableClasses
            names(t)[2:(ncol(t)-1)] <- paste0 ("Classe ",names(t)[2:(ncol(t)-1)])
            t
          }
          else if (class(IndEtTableDep[,VariableClasses])=="integer" |
                   class(IndEtTableDep[,VariableClasses])=="numeric"){
            
            
            t <- IndEtTableDep %>% 
              group_by(Classes) %>% 
              dplyr::summarise (Min = min(eval(parse(text=VariableClasses)), na.rm= T), 
                                Quartile1 = quantile(eval(parse(text=VariableClasses)), .25, na.rm = T),
                                Mediane = round(median(eval(parse(text=VariableClasses)), na.rm = T),0),
                                Moyenne = round(mean(eval(parse(text=VariableClasses)), na.rm = T),1), 
                                Quartile3 = quantile(eval(parse(text=VariableClasses)), .75, na.rm = T),
                                Max = max(eval(parse(text=VariableClasses)), na.rm = T), 
                                NbreNA = sum(is.na(eval(parse(text=VariableClasses)))))
            t
          }
          
        })
        
        
        # Selection de la variable pour représentation des individus dans les graphiques :
        
        output$SelectVarClassesGraphe <- renderUI ({
          
          ## Validations / erreurs :
          validate(
            need(nrow(donnees_entree())!=0, "")
          )
          
          validate(
            need(input$ID!= " ", "")
          )
          
          selectInput("VarClassesGraphe", "Variables en couleurs (classes, par défaut) :",
                      choices=as.list(c(" ",names(test3()))),selected=" ")
        })
        
        
        
        output$TableVarClasses <- renderTable({
          TableVarClasses <- TableVarClasses ()
        })
        
        # output$plot2 <- renderPlot({
        #  cah <- cah()
        #  NbreClasses <- input$NbreClasses
        #  plot(cah, choice = "tree")
        # })
        
        # output$plot4<-renderPlot({
        #    cah <- cah()
        #  plot(cah,choice='3D.map')
        # })
        
        #output$graph3<-renderPlot({
        #  tmp<-HCPCInput()
        #  plot.HCPC(tmp,choice='tree',title='Arbre hiérarchique') 
        #})
        
        # output$bilan_HCPC <- renderTable({
        #    tmp<-HCPCInput()
        #    summary(tmp)
        #  })
        
        # F/ Boutons et téléchargements ------------
        #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        
        # A REVOIR / FAIRE - NON UTILISE
        #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\====
        
        output$DLMetaDonnees <- downloadHandler( 
          
          #write.csv2(IndEtClasses, "IndividusEtClasses", na="", row.names = F)
          filename=function() {
            paste0("MetaDonneesACM_",Sys.Date(),".csv")
          },
          content = function(file) {
            TableMeta <- TableMeta()
            write.csv2(TableMeta, file, fileEncoding = "UTF-8", na = "", row.names = FALSE )
          }
        )
        output$TableIndividusClasses <- downloadHandler( 
          
          #write.csv2(IndEtClasses, "IndividusEtClasses", na="", row.names = F)
          filename=function() {
            paste0("IndividusEtClasses",".csv")
          },
          content = function(file) {
            IndEtClasses <- IndEtClasses()
            write.csv2(IndEtClasses, file, fileEncoding = "UTF-8", na = "", row.names = FALSE )
          }
        )
        
        
        output$TableDepClasses <- downloadHandler( 
          
          filename=function() {
            paste0("TableDepartEtClasses",".csv")
          },
          content = function(file) {
            IndEtTableDep <- IndEtTableDep()
            write.csv2(IndEtTableDep, file, fileEncoding = "UTF-8", na = "", row.names = FALSE )
          }
        )
        
        output$DlTableVar1 <- downloadHandler( 
          filename=function() {
            paste0("TableVariables",".csv")
          },
          content = function(file) {
            
            TableVar <- TableVar()
            write.csv2(TableVar, file, fileEncoding = "UTF-8", na = "", row.names = FALSE )
          }
        )
        
        output$DlTableVar2 <- downloadHandler( 
          filename=function() {
            paste0("TableVariables2",".csv")
          },
          content = function(file) {
            
            TableVar2 <- TableVar2()
            write.csv2(TableVar2, file, fileEncoding = "UTF-8", na = "", row.names = FALSE )
          }
        )
        
        output$DlTableInd1 <- downloadHandler( 
          filename=function() {
            paste0("TableIndividus",".csv")
          },
          content = function(file) {
            
            TableInd <- TableInd()
            write.csv2(TableInd, file, fileEncoding = "UTF-8", na = "", row.names = FALSE )
          }
        )
        
        
        output$DlTableInd2 <- downloadHandler( 
          filename=function() {
            paste0("TableIndividus2",".csv")
          },
          content = function(file) {
            
            TableInd2 <- TableInd2()
            write.csv2(TableInd2, file, fileEncoding = "UTF-8", na = "", row.names = FALSE )
          }
        )
        
        output$PasDID <- downloadHandler( 
          filename=function() {
            paste0("TablePourACM_",Sys.Date(),".csv")
          },
          content = function(file) {
            
            donnees_entree <- donnees_entree()
            donnees_entree$ID <- row.names(donnees_entree)
            donnees_entree <- donnees_entree[, c(ncol(donnees_entree), 1:ncol(donnees_entree)-1)]
            write.csv2(donnees_entree, file, fileEncoding = "UTF-8", na = "", row.names = FALSE )
          }
        )
        
        output$DlCroisCl <- downloadHandler(
          
          
          filename=function() {
            
            VariableClasses <-  input$VariableClasses
            paste0("Table_",VariableClasses, "_Classes.csv")
          },
          content = function(file) {
            
            
            TableVarClasses <- TableVarClasses() 
            
            write.csv2(TableVarClasses, file, fileEncoding = "UTF-8", na = "", row.names = FALSE , dec=",")
          }
        )
        
        
        
        # output$PasDID <- renderUI ({
        #   checkboxInput("NoID", "Je n'ai pas d'identifiant" )
        # })
        
        
        
        
        # output$DLTableVar <- downloadHandler( 
        
        #    filename = function() {
        #     paste('TableVar_', Sys.Date(), '.csv', sep='')
        #  },
        #  content = function(con) {
        #    write.csv2(TableVar, con, na="")
        #  }
        #    )
        
        
        #   observeEvent(input$PasDID, {
        
        #   donnees_entree <- donnees_entree()
        #   write.csv2(donnees_entree, "Donnees_ACM.csv", na="", fileEncoding = "UTF-8")
        #   donnees_entree <- read.csv2("Donnees_ACM.csv", fileEncoding = "UTF-8")
        # })
        
        
        # output$downloadPlot <- downloadHandler(
        #  filename = "Shinyplot.png",
        # content = function(file) {
        #  png(file, width = 850, height = 500)
        # graphVar()
        #dev.off()
        # }) 
        
        # Noms des variables illustratives (REMONTER) :
        
        VarsIllusMeta <- reactive({
          #  if (is.null(input$VarIllusPourACM)) return (NULL)
          VarsIllus <- input$VarIllusPourACM
          TableACM <- TableACM()
          
          
          if (length(VarsIllus)==0){
            c<-""
          }else if (length(VarsIllus)==1){
            c<-VarsIllus[1]
          }else{
            
            c<- VarsIllus[1]
            for (i in 2:length(VarsIllus)) {
              c <- paste(c, VarsIllus[i], sep=", ")
            }
          }
          c
        })
        
        VarsIllusQuantiMeta <- reactive({
          #  if (is.null(input$VarIllusPourACM)) return (NULL)
          VarsIllusQuanti <- input$VarIllusQuantiPourACM
          
          if (length(VarsIllusQuanti)==0){
            c<-""
          }else if (length(VarsIllusQuanti)==1){
            c<-VarsIllusQuanti[1]
          }else{
            
            c<- VarsIllusQuanti[1]
            for (i in 2:length(VarsIllusQuanti)) {
              c <- paste(c, VarsIllusQuanti[i], sep=", ")
            }
          }
          c
        })
        
        # G/ Informations synthétiques sur les options de la session -------------
        #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
        
        
        TableMeta <- reactive ({
          
          # Nom du fichier téléchargé :
          
          NomFichier <-  file_name()
          
          # Noms des variables conservées pour l'ACM :
          
          TableACM <- TableACM()
          NomVar <- names(TableACM[1])
          for (i in 2:ncol(TableACM)) {
            NomVar <-  paste(NomVar, names(TableACM[i]), sep=", ")
          }
          
          # Noms des variables illustratives :
          
          Illus <-  VarsIllusMeta()
          IllusQuanti <- VarsIllusQuantiMeta()
          
          # Filtres sur les individus :
          
          Variable1 <- input$Variable1
          Modalite1 <- input$Modalite1
          Operateur1 <- input$Operateur1
          OperateurMid <- input$OperateurMid
          Variable2 <- input$Variable2
          Modalite2 <- input$Modalite2
          Operateur2 <- input$Operateur2
          OperateurMid2 <- input$OperateurMid2
          Variable3 <- input$Variable3
          Modalite3 <- input$Modalite3
          Operateur3 <- input$Operateur3
          OperateurMid3 <- input$OperateurMid3
          Variable4 <- input$Variable4
          Modalite4 <- input$Modalite4
          Operateur4 <- input$Operateur4
          filtre <- paste(Variable1, Operateur1, Modalite1, OperateurMid,
                          Variable2, Operateur2, Modalite2, OperateurMid2,
                          Variable3, Operateur3, Modalite3,OperateurMid3,
                          Variable4, Operateur4, Modalite4,
                          sep=" ")
          Type.Cl <- input$Type.Cl
          Metric.Cl <- input$Metric.Cl
          Agreg.Cl <- input$Agreg.Cl
          NbAxes.Cl <- input$NbAxes.Cl
          Part.H.Cl <- input$Part.H.Cl
          NbreClasses <- input$NbreClasses
          VarClassesGraphe <- input$VarClassesGraphe
          
          
          # Tables synthétisant les informations métadonnées :
          
          TableMeta <- data.frame (Champs = c("Date et heure",
                                              "Nom du fichier",
                                              "Identifiant principal",
                                              "Identifiant graphique des individus",
                                              "Couleurs dans le graphe des individus",
                                              "Filtre(s) sur les individus",
                                              "Variables incluses dans l'ACM",
                                              "Dont variables illustratives qualitatives",
                                              "Dont variables illustratives quantitatives",
                                              "Type de classification",
                                              "Options sur la classification"), Valeurs = rep("", 11),
                                   stringsAsFactors = F)
          
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Date et heure",
                                       format(Sys.time(), "%d/%m/%Y, %H:%m"), TableMeta$Valeurs)
          
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Nom du fichier",
                                       NomFichier, TableMeta$Valeurs)
          
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Identifiant principal",
                                       input$ID, TableMeta$Valeurs)
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Identifiant graphique des individus",
                                       input$LabelGraphInd, TableMeta$Valeurs)
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Couleurs dans le graphe des individus",
                                       ifelse(VarClassesGraphe == " ",
                                              ifelse(NbreClasses == 1,
                                                     "Aucune", 
                                                     "Les classes"),
                                              VarClassesGraphe), 
                                       TableMeta$Valeurs)
          
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Filtre(s) sur les individus",
                                       filtre, TableMeta$Valeurs)
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Variables incluses dans l'ACM",
                                       NomVar, TableMeta$Valeurs)
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Dont variables illustratives qualitatives",
                                       Illus, TableMeta$Valeurs)
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Dont variables illustratives quantitatives",
                                       IllusQuanti, TableMeta$Valeurs)
          
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Type de classification",
                                       Type.Cl, TableMeta$Valeurs)
          
          TableMeta$Valeurs <- ifelse (TableMeta$Champs=="Options sur la classification",
                                       ifelse(Type.Cl == "Pas de classification","-",
                                              paste0("Métrique ",
                                                     Metric.Cl,
                                                     ", agrégation ",
                                                     Agreg.Cl,
                                                     ", class. ",
                                                     Part.H.Cl,", ", NbreClasses, " classes")), TableMeta$Valeurs)
          
          
          
          TableMeta
        })
        
        output$TableMeta <- renderTable ({
          
          TableMeta()
        })
        
        output$Resume <- renderTable({
          tmp <- donnees_entree()
          if (is.null(tmp)) {return (NULL)}else{
            
            donnees_entree <- data.frame( Variable = names(tmp[1]),
                                          Type = class(tmp[,1]),
                                          NbreValeursDiff = nrow(unique(tmp[1])))
            for (i in (2:ncol(tmp))) {
              donnees_entree <-rbind(donnees_entree, data.frame( Variable = names(tmp[i]),
                                                                 Type = class(tmp[,i]),
                                                                 NbreValeursDiff = nrow(unique(tmp[i]))))
            }
            donnees_entree
          }
        })
        
      }
    
    
    
        ) 
}
Grisoudre/ProdFactoBeta documentation built on May 22, 2019, 12:36 p.m.