Rshiny conditionalPanel et fileInput

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

Jérémy Jachacz
Messages : 153
Enregistré le : 15 Avr 2014, 12:56

Rshiny conditionalPanel et fileInput

Messagepar Jérémy Jachacz » 20 Déc 2022, 14:54

Bonjour,

Pour les besoins d'une app, je dois utiliser 2 fileInput(), je souhaitais en utiliser 2 distincts. Je pense que je vais en utiliser 1 seul au final, avec l'option multiple=T pour contourner ce problème.

Mais j'aimerai comprendre le fonctionnement de ConditionalPanel(), je souhaiterai ;
Si le premier fileInput est non nul (un fichier a été importé) on affiche le nom du fichier 1
Le nom du 2eme fichier est affiché tout le temps sauf quand il n'y en a pas. on affiche "No file selected (file2)"
Comment fonctionne la condition avec un fileInput qui peut-être null au départ ?

j'ai mis des print() partout, pour la traçabilité..

(ce n'est qu'un exemple reproductible de ce que je souhaite faire, pas la vraie application)

Code : Tout sélectionner

if (interactive()){
 
  ui <- fluidPage(
    titlePanel("Application Shiny avec menu dynamique"),

    sidebarLayout(
      sidebarPanel(
        width = 4,
       
        fileInput("file1", "input file 1:"),
        fileInput("file2", "input file 2:"),

        ),
      mainPanel(
       
        conditionalPanel(
          condition = "input.file1 != null",
          textOutput("file1_name")),

          textOutput("file2_name")

      )
      )
    )

server <- function(input, output, session) {
 
  output$file1_name <- renderText({
   
    if (is.null(input$file1)) {
      print("file 1 no file")
      return("No file selected (file1)")
     
    } else {
      print("file 1  file")
      return(paste0("file 1 :", input$file1$name))
    }
  })
 
  output$file2_name <- renderText({
    if (is.null(input$file2)) {
      print("file 2 no file")
      return("No file selected (file2)")
     
    } else {
      print("file 2  file")
      return(paste0("file 2 :", input$file2$name))
    }
  })
 
}

shinyApp(ui, server)

}


il n'affiche jamais le nom du 1er fichier.. et je ne comprend pas pourquoi,
j'ai testé plein de chose :

Code : Tout sélectionner

          condition = "input.file1 !== null",  # s'affiche pas
          condition = "input.file1 != 'null'", # s'affiche tout le temps
          condition = "input.file1 !== 'null'", # s'affiche tout le temps


Merci
Statisticien (69)

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Rshiny conditionalPanel et fileInput

Messagepar Maxime Deniaux » 06 Jan 2023, 15:23

Salut Jérémy,

avec du retard...tu as peut-être déjà trouvé la réponse à ta question.
Mais comme personne n'a répondu et toi pas donné de retour, j'ai regardé rapidement.

Peux-tu essayer de remplacer ton

Code : Tout sélectionner

conditionalPanel(
          condition = "input.file1 != null",


par

Code : Tout sélectionner

conditionalPanel(
          condition = "!is.null(input.file1)",


et me dire si tu obtiens ce que tu voulais !

Bonne fin de journée

Jérémy Jachacz
Messages : 153
Enregistré le : 15 Avr 2014, 12:56

Re: Rshiny conditionalPanel et fileInput

Messagepar Jérémy Jachacz » 15 Jan 2023, 18:33

Salut,

Merci pour ta réponse,
Je n'ai pas vraiment trouver de réponse, j'ai surtout utilisé une alternative.
Néanmoins je suis curieux de comprendre pour quoi ce fonctionnement..
j'ai essayé ta solution et il affiche tout le temps le nom du 1er fichier, alors qu'il faudrait qu'il l'affiche seulement quand il y en a un d'importé..

Bonne journée
Jérémy
Statisticien (69)

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Rshiny conditionalPanel et fileInput

Messagepar Maxime Deniaux » 15 Jan 2023, 18:39

Jérémy Jachacz a écrit :Salut,

Merci pour ta réponse,
Je n'ai pas vraiment trouver de réponse, j'ai surtout utilisé une alternative.
Néanmoins je suis curieux de comprendre pour quoi ce fonctionnement..
j'ai essayé ta solution et il affiche tout le temps le nom du 1er fichier, alors qu'il faudrait qu'il l'affiche seulement quand il y en a un d'importé..

Bonne journée
Jérémy


Salut,

ah oui merde je viens de relire la discussion et j'avais sûrement du me concentrer sur la fin de ton message où tu disais que ça n'affichait jamais le nom du fichier 1. Et du coup, j''avais oublié visiblement que tu voulais que ça l'affiche seulement quand il y a une importation.

Je regardai dans les prochains jours quand j'aurais un peu de temps

Bonne soirée

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Rshiny conditionalPanel et fileInput

Messagepar Maxime Deniaux » 16 Jan 2023, 09:01

Salut,

bah du coup sauf si j'ai encore mal compris la demande, je pense que l'erreur était au niveau du return.
Tu lui disais que si c'est NULL, tu return le message "No file selected (file 1)". Donc il y avait forcément toujours un message qu'il y ait une importation ou non.

Donc avec correction du code (j'ai gardé ma proposition de ma première réponse et ai mis en # les lignes qui ne servaient pas ou posaient problème), cela donnerait ça :

Code : Tout sélectionner

if (interactive()){
 
  ui <- fluidPage(
    titlePanel("Application Shiny avec menu dynamique"),

    sidebarLayout(
      sidebarPanel(
        width = 4,
       
        fileInput("file1", "input file 1:"),
        fileInput("file2", "input file 2:"),

        ),
      mainPanel(
       
        conditionalPanel(
          condition = "!is.null(input.file1)",
          textOutput("file1_name")),

          textOutput("file2_name")

      )
      )
    )

server <- function(input, output, session) {
 
  output$file1_name <- renderText({
   
    if (!is.null(input$file1)) {
    # print("file 1 no file")
    #   return("No file selected (file1)")
    # 
    # } else {
    #   print("file 1  file")
      return(paste0("file 1 :", input$file1$name))
    }
  })
 
  output$file2_name <- renderText({
    if (is.null(input$file2)) {
      # print("file 2 no file")
      return("No file selected (file2)")
     
    } else {
      # print("file 2  file")
      return(paste0("file 2 :", input$file2$name))
    }
  })
 
}

shinyApp(ui, server)

}


Donc, au final j'ai un affichage au lancement de l'application pour le file2 (le message par défaut), et si j'importe le file 1, j'ai le nom qui apparaît, et si j'importe le file2, également.

J'espère que c'est ce que tu voulais

Bonne journée

Jérémy Jachacz
Messages : 153
Enregistré le : 15 Avr 2014, 12:56

Re: Rshiny conditionalPanel et fileInput

Messagepar Jérémy Jachacz » 25 Jan 2023, 07:55

Bonjour,

Merci,
Oui avec ta proposition cela fonctionne.. enfin presque, mais le conditionnalPanel n'a plus d'intérêt ici, si on l'enlève cela fonctionne aussi.
Je pense avoir construis ça de cette manière pour justement voir si le conditionnalPanel fonctionne ;

Pour moi, peu importe ce que renderText() retourne, c'est conditionnalPanel qui fait l'affichage, et donc renderText() retourne "No file selected (file 1)" mais comme conditionnalPanel() ne doit pas afficher le textOutput, alors il ne doit pas être visible.. (Néanmoins le textOutput contient bien "No file selected (file 1)", c'est juste masqué).

Je me trompe peut-être..

Merci,
N'y passe pas trop de temps, j'ai une alternative avec hidden() et show().
Jérémy
Statisticien (69)

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Rshiny conditionalPanel et fileInput

Messagepar Maxime Deniaux » 25 Jan 2023, 08:50

Salut,

mince...j'ai regardé trop rapidement. Je vais regarder de tout nouveau plus attentivement et je reviendrai commenter ici.

Effectivement, j'ai peut-être "supprimé" l'intérêt de conditional panel sans le vouloir et le voir :')

Non t'inquiète, justement...c'est parce que j'y ai passé très peu de temps que j'ai répondu plusieurs fois à côté...mais je n'ai pas trop eu de temps depuis ma 1ère réponse et comme personne ne te répondais, j'ai voulu essayé d'aider rapidement mais, visiblement je n'ai rien réglé du tout !

PS : je débute en Shiny, ceci explique peut-être cela aussi. Mais c'est aussi pour ça que ça a un intérêt pour moi d'essayer de te répondre à ta question initiale. On est tous là pour progresser (:

a+ avec une bonne réponse je l'espère...

Maxime Deniaux
Messages : 68
Enregistré le : 11 Fév 2022, 22:49
Contact :

Re: Rshiny conditionalPanel et fileInput

Messagepar Maxime Deniaux » 25 Jan 2023, 09:57

Re,

bon j'ai cherché un peu sur internet, notamment ici : https://stackoverflow.com/questions/631 ... ect=1&lq=1

J'ai essayé de reproduire la réponse du post en faisant ce code :

Code : Tout sélectionner

# Load packages ----
library(shiny)


if (interactive()){
 
  ui <- fluidPage(
    titlePanel("Application Shiny avec menu dynamique"),

    sidebarLayout(
      sidebarPanel(
        width = 4,
       
        fileInput("file1", "input file 1:"),
        fileInput("file2", "input file 2:"),

        ),
      mainPanel(
       
        conditionalPanel(
          "output.file1_load",
          textOutput("file1_name")),

          textOutput("file2_name")

      )
      )
    )

server <- function(input, output, session) {
 
  # output$file1_name <- renderText({
  # 
  #   if (is.null(input$file1)) {
  #     print("file 1 no file")
  #     return("No file selected (file1)")
  #   
  #   } else {
  #     print("file 1  file")
  #     return(paste0("file 1 :", input$file1$name))
  #   }
  # })
 
  output$file1_load <- reactive({
      val <- !(is.null(input$file1))
      print(val)
    })
 
  outputOptions(output, 'file1_load', suspendWhenHidden=FALSE)
 

 
  output$file1_name <- renderText({
   
    if (is.null(input$file1)) {
      return("file 1 no file")}
     
    return(paste0("file 1 :", input$file1$name))
   
  })
 
  output$file2_name <- renderText({
    if (is.null(input$file2)) {
      print("file 2 no file")
      return("No file selected (file2)")
     
    } else {
      print("file 2  file")
      return(paste0("file 2 :", input$file2$name))
    }
  })
 
}

shinyApp(ui, server)

}



J'ai réintégré dans le renderText :

if (is.null(input$file1)) {
return("file 1 no file")}


pour voir si les nouvelles lignes ajoutées fonctionnent. Et apparemment l'ajout de :

output$file1_load <- reactive({
val <- !(is.null(input$file1))
print(val)
})

outputOptions(output, 'file1_load', suspendWhenHidden=FALSE)


et le changement aussi dans le ConditionalPanel permet de ne pas afficher le "file 1 no file" évoqué juste au-dessus, même si aucune importation de fichier pour file1. Et par contre, s'il y a une importation alors il affiche bien le nom du fichier choisi.

Donc je pense que le ConditionalPanel fonctionne ici sinon il aurait affiché le "file 1 no file" non ? Mais il faut que je cherche ce que signifie chaque ligne de code car pour l'instant ce n'est pas clair étant donné mon niveau. Peut-être que toi tu comprendras mieux !

J'espère qu'on se rapproche de la solution et compréhension de ce problème :)


Retourner vers « Questions en cours »

Qui est en ligne

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