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 :

Importer les données [shiny]


Sujet :

R

  1. #1
    Membre du Club
    Homme Profil pro
    technicien
    Inscrit en
    Mars 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : technicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 24
    Points : 43
    Points
    43
    Par défaut Importer les données [shiny]
    Bonjour,

    j'utilise Rstudio V3.0.2 et shiny pour développer un dashboard. Dans un premier temps je m’entraîne à écrire un script qui récupère les données et les met en forme avant d’effectuer des traitements statistiques. Jusque-là, pas de problème. Je récupère mes données brutes depuis une bdd, je fais tout un tas de traitements jusqu'à obtenir un jeu de données "exploitable".

    Dans un 2e temps, vu que je suis chaud patate, je commence à m'initier à shiny. J'utilise "ShinyDashboarder" qui me parait pas mal. Ma (première) question:

    - au chargement de la page, je remplis une liste déroulante avec des numéros, disons "1,2,3,4..." (je simplifie) ;
    - j'aimerais que lorsque je choisis quelque chose dans la liste, j'aille récupérer en arrière plan les données concernant ce que j'ai choisi dans la liste
    (si je choisis 1, je récupère les données de 1).

    Il n'y a pas ici de retour d'info ou de "render", je veux juste charger les données pour l'instant, on verra le reste plus tard.

    Je sais écrire un script qui me permet de récupérer les données (assez long d'ailleurs).

    Mon appli :

    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
    library(shiny)
    library(shinydashboard)
    library(dygraphs)
     
    header <- dashboardHeader(
    .
    .
    .
    (etc).
    .
    .
    .
    menuSubItem("jeu1", tabName = "jeu1")
     
    )
     
    body <- dashboardBody(
     
    tabItem("jeu1",
                fluidRow(
                  selectInput("val1", label = h3("Select valeur"), 
                              choices = liste_valeur_jeu1)))
    )
     
     
     
    server <- function(input, output, session) {
    .
    .
    .
    }
    Je ne sais pas quoi mettre ici (observe ? mais quoi, comment ? reactive ? mais quoi, comment ?)

    Merci pour votre aide !...

  2. #2
    Membre averti
    Homme Profil pro
    Data Scientist
    Inscrit en
    Août 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 139
    Points : 316
    Points
    316
    Par défaut
    Bonjour,

    Je n'ai pas trop bien compris ce que tu souhaitais faire. J'ai essentiellement utilisé Shiny et pas encore la version dashboard.

    Pour commencer regarde si l'information ne se trouve pas dans les tutoriels (très bien fait) de RStudio : http://shiny.rstudio.com/tutorial/

    Personnellement, si j'ai bien compris, je choisirais dans la liste déroulante avec selectbox plutôt que selectinput. Ensuite dans une fonction je récupérerais la table de données.

    Mettons que tu aies appelé "test" ton widget qui te permet de sélectionner la valeur que tu veux dans la table (par exemple toutes le lignes contenant 1 dans la variable V1 du data.frame df

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    recuperation <- reactive({
    data <- df[df$V1==1,]
    return(data)
    })
    Ensuite tu peux utiliser cette fonction n'importe où pour faire des graphiques ou quoi, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tes_donnees <- recuperation()
    J'espère avoir pu (un peu) t'aider

  3. #3
    Membre du Club
    Homme Profil pro
    technicien
    Inscrit en
    Mars 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : technicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 24
    Points : 43
    Points
    43
    Par défaut
    Merci chautho pour ta réponse.

    Je n'avais pas vu la "selectbox", elle doit effectivement être bien plus efficace pour ce que je cherchais à faire. J'ai depuis changé un peu de stratégie et abandonné le module "shinyDashboarder" un peu rigide au final. Bon je suis de nouveau bloqué bien sûr. Je vais essayer d'être plus clair, car je crois que je me suis empêtré dans un truc...

    Alors, sur la première page, je génère des boutons dans le sidebar panel. Lorsque je clique sur un des boutons, je génère dans le main panel une autre liste de boutons (en fonction du bouton sur lequel j'ai cliqué dans le sidebar panel). J'arrive jusque-là, mais je suis bloqué ici, lorsque je clique sur un des boutons du main panel, je n'arrive plus à enchaîner, j'y suis presque hein !!! Ce sera plus clair avec les codes complets plus bas.

    Lorsqu'on clique sur a, b ou c, les boutons sont générés dans le main panel. Lorsqu'on clique sur un de ces boutons, rien ne se passe. Mais en rechargeant la page, ça marche, presque. Comme si ma fonction reactive ne récupèrait pas la variable "currentc2".

    Je pense à un problème dans la structure de mon programme (que j'ai essayé de simplifier au maximum). Par exemple: quelles sont les règles pour imbriquer des "observer" et "reactive" ? Y-a-t-il des problèmes "d'environnement" ou de "domains" ?

    Frustration!!! c'est la partie "c2" qui ch*e dans la colle...

    Merci pour votre aide :-)

    Le code:


    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    dans la partie "UI.R":
     
    library(shiny)
    source('ref.R')
     
    PAGE_WIDTH <- 1700
    span.widths <- Reduce(paste, sapply(1:12, function(n) paste0('.span', n, '{width:', floor(n * PAGE_WIDTH / 12), 'px;}')))
     
    shinyUI(fluidPage(
      #Barre de navigation
      navbarPage( title="Test", windowTitle="Test", collapsible=TRUE,
              tabPanel("page 1",
     
      #Sidebar Panel
              sidebarLayout(position="left", fluid=TRUE, 
     
                  sidebarPanel( width= 2, 
                                h4("c1/c2"),
                                  do.call(verticalLayout,row.list.c1)
     
                               ),
                  mainPanel(width = 10,
                            h4(textOutput('txtCurrentc1')),
                            uiOutput('c2.buttons'),
                            h4(textOutput('txtc2Name'))
     
     
     
                            ))
      ),
              tabPanel("page 2")
      )))
     
     
     
     
    la partie "server.R":
     
     
    source('ref.R')
     
    last.states.c1 <<- sapply(as.character(unique(df.parts$c1)), function(Y) 0)
     
    #generation de la liste de bouttons c2 en fonction de c1 selectionne
    renderc2Buttons <- function(currentc1) {
      renderUI({
        lapply(rownames(df.parts[df.parts$c1 == as.character(currentc1), ]), function(cl) {
          with(df.parts[df.parts$c2 == cl, ], 
               actionButton(inputId=paste0('btn', cl),label=cl))
     
        })
     
     
      })
    }
     
     
     
     
    ### MAIN SERVER LOOP
     
    shinyServer(function(input, output, session) {
     
      ###############################################  
      button.states.c1 <- reactive({
        sapply(as.character(unique(df.parts$c1)), function(c1) {input[[paste0("btn",c1)]]})
      })  
     
      # c1 # selection button observer
      observe({
        # Detect which button was pressed
        states.c1 <<- button.states.c1()
        change.c1 <<- states.c1 != last.states.c1
        if (sum(change.c1) > 0) {
          print("checkpoint")
     
          currentc1 <<- names(which(change.c1))[1]
     
          last.states.c2 <<- sapply(as.character(df.parts$c2[df.parts$c1 == as.character(currentc1)]), function(x) 0)
          states.c2 <<- sapply(as.vector(df.parts[df.parts$c1 == currentc1,2]), function(x) 0)
          print("Current c1 Script Executed")
          #Update the UI
          output$txtCurrentc1 <- renderText(paste("Colonne selectionnée ",currentc1))
          output$c2.buttons <- renderc2Buttons(currentc1)
     
        }
     
        # Remember button states
        last.states.c1 <<- states.c1
     
      })  
     
     
    ######################################################
     
    button.states.c2 <- reactive({
     
      sapply(as.vector(df.parts[df.parts$c1 == currentc1,2]), function(cl) input[[paste0('btn', cl)]])
     
    })
     
    ######################################################
     
     
      # c2 # selection button observer
      observe({
        # Detect which button was pressed
     
        states.c2 <<- button.states.c2()
        print(states.c2)
        change.c2 <- states.c2 != last.states.c2
        print(change.c2)
        if (sum(change.c2) != 0) {
          print("checkpoint c2")
          currentc2 <<- names(which(change.c2))[1]
          # Update the UI
          output$txtc2Name <- renderText(as.character(df.parts$c2[df.parts$c2 == as.character(currentc2)]))      
        }
     
        # Remember button states
        last.states.c2 <<- states.c2
      })
    })
     
     
     
     
    et enfin la partie "ref.R":
     
    currentc1 <- NULL
     
    #Creation du data frame
    df.parts <- data.frame(c1 = c("a","a","a","a","a","b","b","b","c","c","c","c","c","c"), c2 = c("1","2","3","4","5","6","7","8","9","10","11","12","13","14"))
     
    rownames(df.parts) <- df.parts$c2
     
     
    row.list.c1 <- lapply(unique(df.parts$c1), function(p){
      c1.buttons <- lapply(p, function(c1){
        actionButton(inputId=paste0("btn",c1), label=c1)
      })
      fluidRow(id= p, c1.buttons)
    })

  4. #4
    Membre averti
    Homme Profil pro
    Data Scientist
    Inscrit en
    Août 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 139
    Points : 316
    Points
    316
    Par défaut
    Bonjour,

    Je suis désolé mais je n'ai pas trop le temps d'essayer ton code, ni de voir où ça coince.

    Par contre je trouve étrange que dans ta partie "server.R" tout ton code servant à gérer ce qu'il va se passer dans l'UI ne soit pas dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shinyServer(function(input, output, session) {}
    C'est peut-être moi qui me trompe mais tu devrais regarder de ce coté-là.

    Sinon, je ne suis pas sûr d'avoir bien compris, mais je pense que les "Conditional Panel" pourraient bien t'aider. En gros, tu affiches quelque chose si il y a eu quelque chose avant. Tu as un exemple très simple ici : http://shiny.rstudio.com/gallery/con...anel-demo.html. Dans l'exemple, il s'agit d'un graphique qui est affiché ou non, mais tu peux aussi choisir d'afficher des widgets type radiobutton etc...

    Bon courage

  5. #5
    Membre du Club
    Homme Profil pro
    technicien
    Inscrit en
    Mars 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : technicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 24
    Points : 43
    Points
    43
    Par défaut
    Bonjour chautho,

    Dans la partie server, j'ai effectivement placé une fonction en-dehors de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shinyServer(function(input, output, session) {}
    . Cela ne change rien, il s'agit simplement de déclarer une fonction qui sera utilisée par le server. Je l'ai déplacée dans la partie "ref.R" pour plus de clarté, ainsi dans la partie "server.R" tout le code se trouve dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shinyServer(function(input, output, session) {}
    .


    Je vais continuer à travailler sur la manière d'imbriquer les observer/reactive...


    A+

  6. #6
    Membre averti
    Homme Profil pro
    Data Scientist
    Inscrit en
    Août 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Scientist
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 139
    Points : 316
    Points
    316
    Par défaut
    Bonjour,

    Tiens-nous au courant de l'avancée de tes problèmes et n'hésite pas à marquer ton poste résolu en nous montrant la solution que tu auras utilisée si tu y arrives ! Merci

  7. #7
    Membre du Club
    Homme Profil pro
    technicien
    Inscrit en
    Mars 2015
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : technicien
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 24
    Points : 43
    Points
    43
    Par défaut
    Hey,

    La solution: il s'agissait bien d'imbriquer correctement les "observer" et non de les créer les uns à la suite des autres.
    Le code complet:

    Partie UI:

    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
    library(shiny)
    source('ref.R')
     
    PAGE_WIDTH <- 1700
    span.widths <- Reduce(paste, sapply(1:12, function(n) paste0('.span', n, '{width:', floor(n * PAGE_WIDTH / 12), 'px;}')))
     
    shinyUI(fluidPage(
      #Barre de navigation
      navbarPage( title="Test", windowTitle="Test", collapsible=TRUE,
              tabPanel("page 1",
     
      #Sidebar Panel
              sidebarLayout(position="left", fluid=TRUE, 
     
                  sidebarPanel( width= 2, 
                                h4("c1/c2"),
                                  do.call(verticalLayout,row.list.c1)
     
                               ),
                  mainPanel(width = 10,
                            h4(textOutput('txtCurrentc1')),
                            uiOutput('c2.buttons'),
                            h4(textOutput('txtc2Name'))
     
     
     
                            ))
      ),
              tabPanel("page 2")
      )))

    Partie Server:


    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
    source('ref.R')
     
     
    ### MAIN SERVER LOOP
     
    shinyServer(function(input, output, session) {
     
      ###############################################  
      button.states.c1 <- reactive({
        sapply(as.character(unique(df.parts$c1)), function(c1) {input[[paste0("btn",c1)]]})
      })  
     
      # c1 # selection button observer
      observe({
        # Detect which button was pressed
        states.c1 <<- button.states.c1()
        change.c1 <<- states.c1 != last.states.c1
        if (sum(change.c1) > 0) {
     
          currentc1 <<- names(which(change.c1))[1]
     
          last.states.c2 <<- sapply(as.character(df.parts$c2[df.parts$c1 == as.character(currentc1)]), function(x) 0)
     
          states.c2 <<- sapply(as.character(df.parts$c2[df.parts$c1 == as.character(currentc1)]), function(x) 0)
     
          #Update the UI
          output$txtCurrentc1 <- renderText(paste("Colonne selectionnée ",currentc1))
          output$c2.buttons <- renderc2Buttons(currentc1)
     
     
                # c2 # selection button observer
                observe({
                  # Detect which button was pressed
     
                  #states.c2 <<- button.states.c2()
                  states.c2 <<- sapply(as.character(df.parts$c2[df.parts$c1 == as.character(currentc1)]), function(cl) {input[[paste0("btn",cl)]]})
                  if ((!is.list(states.c2)) & (!is.list(last.states.c2))==TRUE){
                  change.c2 <<- states.c2 != last.states.c2
     
                    if (sum(change.c2) != 0) {
     
                      currentc2 <<- names(which(change.c2))[1]
                      # Update the UI
                      output$txtc2Name <- renderText(as.character(df.parts$c2[df.parts$c2 == as.character(currentc2)]))      
                    }
     
                  # Remember button states
                  last.states.c2 <<- states.c2
                }
                })
     
        }
     
        # Remember button states
        last.states.c1 <<- states.c1
     
      })  
     
    })

    Partie "ref.R":

    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
    currentc1 <- NULL
     
    #Creation du data frame
    df.parts <- data.frame(c1 = c("a","a","a","a","a","b","b","b","c","c","c","c","c","c"), c2 = c("1","2","3","4","5","6","7","8","9","10","11","12","13","14"))
     
    rownames(df.parts) <- df.parts$c2
     
     
    row.list.c1 <- lapply(unique(df.parts$c1), function(p){
      c1.buttons <- lapply(p, function(c1){
        actionButton(inputId=paste0("btn",c1), label=c1)
      })
      fluidRow(id= p, c1.buttons)
    })
     
     
     
    last.states.c1 <<- sapply(as.character(unique(df.parts$c1)), function(Y) 0)
     
    #generation de la liste de bouttons c2 en fonction de c1 selectionne
    renderc2Buttons <- function(currentc1) {
      renderUI({
        lapply(rownames(df.parts[df.parts$c1 == as.character(currentc1), ]), function(cl) {
          with(df.parts[df.parts$c2 == cl, ], 
               actionButton(inputId=paste0('btn', cl),label=cl))
     
        })
     
     
      })
    }
    À bientôt pour de nouvelles aventures...

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

Discussions similaires

  1. [MySQL] Importer les données d'un fichier CSV dans une base de données
    Par joueur dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/11/2008, 11h59
  2. importer les donneés.
    Par samsoum dans le forum Oracle
    Réponses: 1
    Dernier message: 22/11/2005, 17h41
  3. importer les données d'une base access
    Par warraf dans le forum Access
    Réponses: 9
    Dernier message: 08/11/2005, 22h40
  4. importer les données d'une base oracle
    Par hossni dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 07/07/2005, 16h33
  5. [DTS] importer les données
    Par flogreg dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/03/2005, 13h01

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