IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Shiny - Problème de longueur dans l'assemblage de 2 dataframes


Sujet :

R

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Géomaticien
    Inscrit en
    Avril 2019
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Avril 2019
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Shiny - Problème de longueur dans l'assemblage de 2 dataframes
    Bonjour,

    J'ai un soucis avec l'assemblage de 2 dataframes dans mon application. Voici le fonctionnement de l'application :
    - En entrée je sélectionne des critères qui vont me permettre d'afficher des données issues d'un fichier .ods (le premier dataframe)
    - J'ajoute en plus deux colonnes boutons : une pour faire de la validation de ligne et l'autre avec des liens pour chaque ligne. (le deuxième dataframe)

    Le problème c'est que pour les colonnes bouton on me demande une longueur qui doit (de ce que j'ai compris) correspondre au nombre de lignes à afficher. Mais comme c'est dépendant des critères du premier dataframe, je ne peux pas mettre un nombre fixe car c'est variable. Je ne vois pas comment résoudre le problème, mais peut-être que ma logique n'est pas bonne.

    Voici le code coté serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    server = function(input, output, session) {
     
     
      #Création de la fonction shinyInput
      shinyInput <- function(FUN, len, id, ...) {
        inputs <- character(len)
        for (i in seq_len(len)) {
          inputs[i] <- as.character(FUN(paste0(id, i), ...))
        }
        inputs
      }
     
      #Création des colonnes bouton
      df <- reactiveValues(data = data.frame(
        validation = shinyInput(actionButton, 1,
                                id = "button_",
                                label = "Check",
                                onclick = 'Shiny.onInputChange(\"select_button\", this.id)'),
        lien_fiches = createLink(base$fiches.donnees)[1]
     
      ))
     
      #Création de la règle de filtre a partir des critères
      create_rules <- reactive({
        paste(c(input$territoire, input$doc), "== 'Oui'",  collapse = " | ")
      })
     
      #Extraction des critères de la base
      FinalData <- eventReactive(input$submit, {
        if(is.null(c(input$territoire, input$doc)))
          return()
        else (base %>% filter_(create_rules()))
      })
     
      #Assemblage des deux dataframe
      fdt <- eventReactive(input$submit, {
        tmp_fdt <- cbind(FinalData()[1:3], df$data)
        colnames(tmp_fdt) <- c("Sous-thèmes", "Données", "Insee", "Validation", "Fiches données")
        tmp_fdt
      })
     
      #Filtres
      gfilter <- reactive({
        filtered_data <- fdt()
     
        #Filtres simples
        if (input$f_st != "Tous" & input$f_don == "Tous"){
          filtered_data <- filtered_data[FinalData()$sous.themes == input$f_st,]
          updateSelectInput(session, inputId = "f_don", choices = c("Tous", filtered_data[2]))
        }
        if (input$f_don != "Tous" & input$f_st == "Tous"){
          filtered_data <- filtered_data[FinalData()$donnees == input$f_don,]
          updateSelectInput(session, inputId = "f_st", choices = c("Tous", filtered_data[1,1]))
        }
        if (input$f_check != "Tous" & input$f_check == "Check"){
          filtered_data <- filtered_data[FinalData()$select_button == input$f_check,]
        }
        if (input$f_check != "Tous" & input$f_check == "Ok"){
          filtered_data <- filtered_data[FinalData()$df$validation == input$f_check,]
        }
        if (input$f_doc != "Tous" & input$f_doc == "PCAET"){
          filtered_data <- filtered_data[FinalData()$PCAET == "Oui",]
          updateSelectInput(session, inputId = "f_don", choices = c("Tous", filtered_data[2]))
          updateSelectInput(session, inputId = "f_st", choices = c("Tous", filtered_data[1,1]))
        }
     
        return(filtered_data)
      })
     
      #Rendu de la table d'extraction
      output$Synthese <-  DT::renderDT(DT::datatable({
     
        gfilter()
     
      },
     
      escape = FALSE,
      selection = "none",
      extensions="Buttons",
      options = list(
        pageLength = 100,
        #Cache la colonne "Insee"
        columnDefs = list(list(visible=FALSE, targets=3)),
     
        #Couleur du header de l'extraction
        initComplete = JS(
          "function(settings, json) {",
          "$(this.api().table().header()).css({'background-color': '#1A242F', 'color': '#fff'});",
          "}"),
     
        #Paramètrage des boutons d'export
        dom="Bfrtip",
        buttons =  list(list(
          extend = "collection",
          filename = "Extraction",
          buttons = c("copy", "csv", "excel", "pdf", "print"),
          text = "Télécharger la sélection")
        ),
        language = list(paginate = 
                          list('next'="suivant", 
                               'previous'="précédent"),
                        info = "Pages de _PAGE_ à _PAGES_",
                        search = "Rechercher",
                        infoFiltered = "(filtre des _MAX_ lignes)")
      )))
     
    }
    Merci pour votre aide

  2. #2
    Membre à l'essai
    Homme Profil pro
    Data Scientist
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Data Scientist

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Points : 12
    Points
    12
    Par défaut
    Hello,

    Tu n'as pas besoin de créer un reactiveValues pour ça.

    C'est au moment où tu crées l'objet fdt qu'il faut que tu crées tes 2 autres colonnes qui contiennent les boutons. Comme tu as déjà l'autre morceau du data.frame, c'est-à-dire FinalData(), tu sais déjà combien il y a de lignes dedans. Et donc ça répond à ta question.

    Autre note : Je ne séparerais pas les étapes FinalData et fdt. Elles sont toutes les deux triggered par le bouton input$submit. Qu'est-ce qui se passe si jamais le code de fdt roule avant le code de FinalData ? Une erreur. Qui va disparaître dès que FinalData sera résolu, mais ça risque de faire clignoter un message d'erreur, et ça fait faire des calculs pour rien. De plus, il n'y a pas vraiment de raison de séparer ces 2 étapes ici. Tu peux les mettre toutes les deux dans un eventReactive(input$submit). Tu n'as pas besoin de garder FinalData() de toute façon (et si tu en as besoin, ben c'est contenu dans fdt() aussi donc tu perds rien).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/02/2010, 09h54
  2. Problème de longueur de requête dans une procédure stockée
    Par doudou_rennes dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/03/2007, 16h39
  3. Réponses: 1
    Dernier message: 11/02/2007, 11h45
  4. Réponses: 19
    Dernier message: 27/08/2003, 15h32
  5. problème de guillemets dans une formule shell
    Par dim_italia dans le forum VBA Access
    Réponses: 7
    Dernier message: 18/08/2003, 12h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo