R-Shiny : Importation fichier Excel + Fusion

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Clement Robert
Messages : 31
Enregistré le : 17 Mai 2016, 09:52

R-Shiny : Importation fichier Excel + Fusion

Messagepar Clement Robert » 07 Juin 2016, 14:05

Bonjour à tous,

J'essaie de développer une application Shiny permettant d'automatiser mes résultats. Étant débutant en Shiny, je bloque sur quelques points.
Pour l'instant mon objectif est d'importer deux jeux de données (format excel) et de construire une base correspondant aux colonnes communes de ces jeux de données.

J'ai du mal à gérer les objets dans shiny ... Le but serait que l'utilisateur choisisse les deux jeux à l'aide d'un fileInput et qu'il soit stocké en mémoire.
Je ne sais pas si je m'y prend correctement malgré avoir parcouru de nombreux sites ...

NB : inFile2$Annee <- input$annee2 consiste a créer une nouvelle variable dans le fichier avec pour chaque ligne l'année d'étude. Je ne sais pas si la syntaxe est bonne.

UI :

Code : Tout sélectionner

shinyUI(
  fluidPage(
    navbarPage(div(img(src="LogoXpertia2.gif"),"Classification Rentabilite"),
               

###########################################################                   
#              1er onglet : Importation                  #
###########################################################

                   tabPanel("Importation",
                            sidebarLayout(
                              sidebarPanel(
                                fileInput('donnees1', "Importez fichier annee_N :"),
                                tags$hr(),
                                checkboxInput('header1', "1ere ligne = Noms variables", TRUE),
                                numericInput("sheet1", "Onglet n°:", 2),
                                numericInput("annee1", "Annee d'etude :", 2014),
                                br(),
                                fileInput('donnees2', "Importez fichier annee_N+1:"),
                                tags$hr(),
                                checkboxInput('header2', "1ere ligne = Noms variables", TRUE),
                                numericInput("sheet2", "Onglet n°:", 8),
                                numericInput("annee2", "Annee d'etude :", 2015)
                              ),

                              mainPanel(
                              )
                            )
                   ),

###########################################################                   
#  2eme onglet :                                          #
###########################################################

                   tabPanel("Résumé",
                            verbatimTextOutput("summary")
                   )


SERVER :

Code : Tout sélectionner

shinyServer(function(input, output) {
 
  #Import Annee N
  donnees_N <- reactive({
    inFile <- input$donnees1
    if (is.null(inFile))
      return(NULL)   
    file.rename(inFile$datapath,
                paste(inFile$datapath, ".xlsx"))
   
    readXL(paste(inFile$datapath,".xlsx"),rownames=FALSE, header=input$header1, na="", sheet=input$sheet1,stringsAsFactors=TRUE)
  })
 
 
  #Import Annee N+1
  donnees_N_1 <- reactive({
    inFile2 <- input$donnees2
    if (is.null(inFile2))
      return(NULL)
   
    file.rename(inFile2$datapath,
                paste(inFile2$datapath, ".xlsx"))
   
    readXL(paste(inFile2$datapath,".xlsx"),rownames=FALSE, header=input$header2, na="", sheet=input$sheet2,stringsAsFactors=TRUE)
    inFile2$Annee <- input$annee2
  })
 
  })
  })



J'ai testé pas mal de chose que j'ai retiré pour le post ne sois pas trop imbuvable. Par exemple je voulais essayer de faire un summary de donnees_N pour voir si l'import s'était bien déroulé : (aucune erreur mais le résume n'apparait pas)

Code : Tout sélectionner

  output$summary <- renderTable({
    if (is.null(donnees_N())){return()}
    summary(donnees_N())
  })



Si quelqu'un voit où est le problème. Faut-il bien stocker mes données avec "reactive"
Merci d'avance,
Cdlt

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: R-Shiny : Importation fichier Excel + Fusion

Messagepar Serge Rapenne » 07 Juin 2016, 15:41

Bonjour,

A ma connaissance, inFile$datapath contient le chemin et le nom complet du fichier sélectionné, le file.rename et le paste ".xlsx" sont inutiles (et d'ailleurs je ne comprend pas le rôle du rename.file puisqu'il va renommer "fichier.xlsx" en "fichier.xlsx .xlsx" . A ce sujet attention sur le paste. Par défaut paste ajoute un séparateur qui est le caractère espace, il faut ajouter le paramètre sep="" ou utiliser la fonction paste0 pour ne pas avoir de séparateur).
A priori

Code : Tout sélectionner

readXL(inFile$datapath,rownames=FALSE, header=input$header1, na="", sheet=input$sheet1,stringsAsFactors=TRUE)

devrait suffire.

la ligne

Code : Tout sélectionner

inFile2$Annee <- input$annee2

est elle aussi bizarre, l'objet inFile2 n'a pas de variable Annee

Si tu veux modifier le contenu du fichier téléchargé, il faut faire qq chose du style

Code : Tout sélectionner

dta_tmp<-readXL(inFile2$datapath,rownames=FALSE, header=input$header2, na="", sheet=input$sheet2,stringsAsFactors=TRUE)

# ici le code qui modifie dta_tmp

return(dta_tmp)


Serge

Clement Robert
Messages : 31
Enregistré le : 17 Mai 2016, 09:52

Re: R-Shiny : Importation fichier Excel + Fusion

Messagepar Clement Robert » 08 Juin 2016, 07:26

Bonjour Serge,

J'avais mis ce file.rename ainsi que le paste.xlsx car sinon il me renvoie l'erreur suivante : 'Unknown format' et avec les instructions rename et paste .. pas de soucis. Ce sujet avait fait l'objet sur un autre forum .. mais je vois pas d’où vient l'erreur.

Du coup si je veux rajouter une variable au jeu de données qui vient d'être importé je procède bien de la manière suivante :

Code : Tout sélectionner

data_tmp <- readXL(paste(inFile$datapath,".xlsx"),rownames=FALSE, header=input$header1, na="", sheet=input$sheet1,stringsAsFactors=TRUE)
    data_tmp$Annee <- input$annee1
    return(data_tmp)


Je fais pareil pour le deuxième en créant data_tmp2. Et si je veux faire une jointure sur les deux fichiers sur les colonnes communes ?

-Je le fait en créant un autre objet reactive (l’exécution se fera automatiquement ?) comme ceci :

Code : Tout sélectionner

  #Fusion Annee N  et Aneee N + 1
  donnees_N_N_1 <- reactive({
    colCommune <- intersect(colnames(donnees_N), colnames(donnees_N_1))
    dataFinale_N_N_1 <- rbind(donnees_N[, colCommune], donnees_N_1[, colCommune])
    return(dataFinale_N_N_1)
  })
 

Dans ce cas, je me demande si pour créer colCommune je dois faire l'intersect sur colnames(donnees_N) : l'objet reactive ou sur colnames(data_tmp). Et si je suis obligé de stocker les résultats dans un autre objet (ici dataFinale_N_N_1).

- Idem lorsque je voudrais faire un summary du jeu de données fusionné : Pourrais-je le faire sur l'objet donnees_N_N_1 ? ou sur dataFinale_N_N_1 ?

Ça fait beaucoup de petites questions ... mais elles pointent presque toutes sur la notion qui me bloque.

Cdlt

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: R-Shiny : Importation fichier Excel + Fusion

Messagepar Serge Rapenne » 08 Juin 2016, 09:17

les objets data_tmp et dataFinale_N_N_1 sont propres à la déclaration des objets réactifs, ils ne sont pas visible en dehors, il faut donc bien utiliser donnees_N et donnees_N_1.
Par contre comme ce sont des objets réactifs, il ne s'utilisent pas comme des data.frame normaux.
Personnellement j'affecte toujours mes objets réactifs à des variables locales dans les fonctions qui les utilisent. qq choses comme ça :

Code : Tout sélectionner

donnees_N_N_1 <- reactive({
    tmp_donnees_N<-donnees_N()
    tmp_donnees_N_1<-donnees_N_1()
    colCommune <- intersect(colnames(tmp_donnees_N), colnames(dtmp_onnees_N_1))
    dataFinale_N_N_1 <- rbind(tmp_donnees_N[, colCommune], tmp_donnees_N_1[, colCommune])
    return(dataFinale_N_N_1)
  })


et pareil pour le summary

Code : Tout sélectionner

 output$summary <- renderTable({
    tmp<-donnees_N()
    summary(tmp)
})


Serge

Clement Robert
Messages : 31
Enregistré le : 17 Mai 2016, 09:52

Re: R-Shiny : Importation fichier Excel + Fusion

Messagepar Clement Robert » 10 Juin 2016, 07:01

Super ! En suivant cet exemple j'ai réussi à mettre en place qqch !

Cependant depuis hier, je ne comprend pas trop pourquoi l'application plante.. Je lance l'application, et une fois que j'ai importé mes deux fichiers, l'application se ferme sans raison ni message d'erreur ... (alors qu'avant elle fonctionnait sans soucis)

C'est arrivé lorsque j'ai ajouté un simple tableau dans un onglet .. Du coup j'ai commenté l'ensemble du code que j'ai mis en dernier mais le problème persiste..

Quelqu'un aurait déjà rencontré un problème similaire ?

Cdlt

Edit : je suis obligé de reboot l'application (fermé Rstudio et ré ouvrir pour qu'elle refonctionne) dès qu'une erreur apparait elle re-plante et je suis obligé de la reboot ...

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: R-Shiny : Importation fichier Excel + Fusion

Messagepar Mickael Canouil » 10 Juin 2016, 12:07

Bonjour,

le problème de plantage peut venir d'une "incompatibilité" entre les fonctions d'importation de fichiers excel, Windows et shiny.
Je m'explique, si votre fichier excel est ouvert sous windows lors de l'importation du fichier via du javascript (shiny), un problème se présente et fait planter de façon systématique l'application, ou plus précisément le moteur javascript.
Mickaël
mickael.canouil.fr | rlille.fr

Clement Robert
Messages : 31
Enregistré le : 17 Mai 2016, 09:52

Re: R-Shiny : Importation fichier Excel + Fusion

Messagepar Clement Robert » 10 Juin 2016, 12:31

Bonjour Mickaël et merci de votre réponse,

Le problème ne vient pas du fait que mon fichier soit ouvert. C'est assez bizarre ...

En fait, depuis hier dès que je modifie mes scripts (UI et server) si je n'ai fait aucune erreur de programmation l'appli va tourner normalement.
Par contre si je fais une erreur, l'appli ne va pas démarrer et me signaler l'erreur dans la log. Jusque là tout est normal.
Je corrige la coquille dans mes scripts et la quand je relance l'appli elle s'ouvre normalement et quand j''importe mes deux fichiers : elle se ferme toute seule sans message d'erreur.

Dès lors que je sauvegarde mes modifications pour corriger mes erreurs dans le script, je ferme R Stuidio et le réouvre en relançant l'appli : cette fois elle ne va pas se fermer toute seule après l'import ..

Le problème revient dès que je modifie le script et si par mes gardes j'y glisse une coquille. Je serais obligé de tout fermer et réouvrir ..

Pas dramatique ... mais pas très confortable !

NB : - Je précise que dès que l'import est fait, cela fait appel a des objets réactifs et mouline les résultats à partir de ces deux fichiers
-Avant je n'étais pas confronté à ce soucis


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité