[Shiny] Reaction involontaire des widgets

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

Charlotte Sirot
Messages : 136
Enregistré le : 14 Nov 2012, 11:05

[Shiny] Reaction involontaire des widgets

Messagepar Charlotte Sirot » 27 Juil 2015, 08:38

Bonjour à tous,

Une question basique mais à laquelle je ne trouve de réponse nulle part (forums,...)

je souhaite mettre à jour la valeur d'une liste suite à un actionButton et à un selectInput qui permettra de déterminer la place de l'élément à mettre à jour.

Tout marche bien sauf que lorsque l'utilisateur change le selectInput et qu'il valide, celui-ci revient à sa valeur "selected".

Voici mon code simplifié :

Code : Tout sélectionner

library(shiny)
runApp(list(
  ui = bootstrapPage(
    uiOutput("choix"),
    uiOutput("valid")
  ),
  server = function(input, output) {
   
    output$choix <- renderUI({
     
      selectInput("exchoix","",choices = names(flag$temp), selected = names(flag$temp)[1])
     
    })
   
    output$valid <- renderUI({
     
      actionButton("valid","valider")
     
    })
   
    flag = reactiveValues(temp = list(
      sample1 = list(
        type = NA
      ),
     
      sample2 = list(
        type = NA
      )
     
    ))
   
   
    observe({
      if(is.null(input$valid)){}
      else{
        isolate({
          if(input$valid > 0){
            flag$temp[[grep(isolate(input$exchoix),names(flag$temp))]]$type <- 1
            print(flag$temp[[grep(isolate(input$exchoix),names(flag$temp))]]$type)
           
          }
        })
       
       
      }
     
     
    })
   
   
   
   
  }
 
))


J'ai remarqué que :
1. ce problème ne se produit que la première fois que l'utilisateur change le selectInput. les autres fois, le script marche nickel.
2. Si on laisse que juste le print, pas de problème, j'ai vraiment l'impression que c'est l'attribution d'une valeur qui pose problème !

Est-ce que quelqu'un a été dans une situation similaire ?

Merci beaucoup de votre aide!!!

Cha
Encore une victoire de canard !

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: [Shiny] Reaction involontaire des widgets

Messagepar Navarre Julien » 27 Juil 2015, 09:37

Bonjour,

je pense que le problème est que tu as pas mal de fonctions/valeurs réactives qui s'appellent les unes dans les autres et que tu crées tes inputs dans des fonctions réactives.
Ton selectInput est crée dans un environnement réactif (renderUI), comme les valeurs que tu utilises pour les choix sont elles aussi des valeurs réactives ton renderUI va donc se ré-exécuter à chaque fois que ces valeurs changent, or ces valeurs réactivent changent à chaque fois que tu sélectionne un nouveaux choix... bref c'est le serpent qui se mord la queue.
Pour être plus clair le problème c'est que tu recrées un selectInput à chaque fois que tu change de choix. Ce selectInput est recrée avec comme choix "selected" la valeur passée en paramètre "names(flag$temp)[1]", c'est pour ça que tu retombes toujours sur cette valeur.

C'est le risque avec les renderUI. C'est pour ça que je te conseille de faire le maximum de chose côté client car c'est bien plus facile à gérer. uiOutput/renderUI sont plutôt à réserver à des outputs complexes, ici tu t'embêtes plus qu'autre chose.

Voici par exemple qque chose de plus simple :

Code : Tout sélectionner

library(shiny)

flag <- list(
  sample1 = list(
    type = NA
  ),
  sample2 = list(
    type = NA
  )
)

runApp(list(
  ui = fluidPage(
    selectInput("index", "Index", sprintf("sample%d", 1:2)),
    actionButton("valid", "valider"),
    verbatimTextOutput("out")
  ),
  server = function(input, output) {
    observe({
      if (input$valid > 0) {
        flag[[isolate(input$index)]]$type <- sample(10, 1)
        output$out <- renderText({flag[[isolate(input$index)]]$type})
      }
    })
  }
))

Charlotte Sirot
Messages : 136
Enregistré le : 14 Nov 2012, 11:05

Re: [Shiny] Reaction involontaire des widgets

Messagepar Charlotte Sirot » 27 Juil 2015, 09:54

Merci beaucoup pour ta réponse Julien !

Malheureusement si ce que j'ai envoyé comme code est si "compliqué" c'est qu'en fait le script que j'ai donné ici n'est seulement qu'un bout de code. En fait ces selectInput et actionButton ne doivent pas apparaître avant que l'utilisateur ait préalablement rempli des conditions. Du coup obligé de les mettre en reactif :'(

je vois pas vraiment comment faire autrement...
Encore une victoire de canard !

Navarre Julien
Messages : 367
Enregistré le : 20 Avr 2012, 08:27

Re: [Shiny] Reaction involontaire des widgets

Messagepar Navarre Julien » 27 Juil 2015, 10:04

Ah d'accord, bon et bien renderUI a l'air en effet très adapté à ta situation.
Du coup difficile de voir comment faire, mais je pense qu'on peut utiliser une petite astuce pour fixer la valeur "selected" à chaque fois qu'on appuie sur le bouton.

Il faut ajouter un paramètre "session" dans la fonction server et utiliser updateSelectInput dans l'observeur du bouton.

Code : Tout sélectionner

server = function(input, output, session)

    observe({
      if (!is.null(input$valid)) {
        isolate({
          if (input$valid > 0) {
            flag$temp[[grep(input$exchoix, names(flag$temp))]]$type <- sample(10, 1)
            print(flag$temp[[grep(input$exchoix,names(flag$temp))]]$type)
            updateSelectInput(session, "exchoix", selected = input$exchoix)
          }
        })
      }
    })


Je pense que ça devrait marcher !

Charlotte Sirot
Messages : 136
Enregistré le : 14 Nov 2012, 11:05

Re: [Shiny] Reaction involontaire des widgets

Messagepar Charlotte Sirot » 27 Juil 2015, 10:35

Wow !! Super Merci beaucoup Julien !

Je ne connaissais pas cette fonction. je vais me renseigner dessus en tout cas, ça marche sur mon script simplifié.

Je vais le tester sur mon script en entier et je retourne vers toi si j'ai un soucis.

Merci mille fois !!!

Cha
Encore une victoire de canard !


Retourner vers « Questions en cours »

Qui est en ligne

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