web-dev-qa-db-fra.com

R Shiny - désactiver / activer les éléments shinyUI

Je cherche un moyen d'implémenter la désactivation/fonctionnalité sur mes éléments shinyUI . Ici xiaodaigh donne un indice sur la façon de désactiver/activer un actionButton (voir une image ci-dessous) et c'est mon résultat souhaité, mais le code ne ne pas faire l'affaire avec d'autres éléments de l'interface graphique que j'ai testés (par exemple numericInput).

(Je connais une fonction conditionalPanel, mais ce n'est pas l'effet que j'aimerais avoir.)

J'apprécierais fortement toute suggestion, notamment parce que je ne connais pas très bien JavaScript.

enter image description here

36
Marta Karas

La raison pour laquelle le code auquel vous créez un lien dans votre question ne fonctionne pas pour les autres widgets d'entrée, car les différents widgets d'entrée ont besoin d'appels JavaScript différents pour être désactivés. Un autre problème est que lorsque brillant crée un élément d'entrée, parfois l'ID que vous fournissez est l'ID de la balise d'entrée HTML réelle tandis que parfois cet ID est donné à un conteneur de la balise d'entrée.

Le paquet shinyjs a une fonction disable qui fonctionnera telle quelle avec n'importe quelle entrée brillante. Avertissement: j'ai écrit ce paquet.

Voici comment procéder pour désactiver un numericInput comme vous l'avez demandé

library(shiny)
runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),
    numericInput("test", "Test", 5),
    actionButton("submit", "Choose")
  ),
  server = function(input, output, session) {
    observeEvent(input$submit, {
      shinyjs::disable("test")
    })
  }
))
49
DeanAttali

Le code suggéré par Dean Attali peut en fait être légèrement modifié pour permettre l'activation et la désactivation comme demandé. Voir l'exemple ci-dessous, qui active ou désactive le curseur en fonction de la valeur donnée (si la valeur dépasse le maximum de la plage, le curseur est désactivé).

library(shiny)
runApp(shinyApp(
    ui = fluidPage(
        shinyjs::useShinyjs(),
        numericInput("val", "Choose value (max 10)", 5),
        sliderInput(inputId = "range",
                    label = "Range",
                    min = 0,
                    max = 10,
                    step = 0.1,
                    value = c(0,2))
    ),
    server = function(input, output, session) {
        observeEvent(input$val, {
            if(input$val <= 10){
                shinyjs::enable("range")
            }else{
                shinyjs::disable("range")
            }
        })
    }
))

3
tokami

qu'en est-il lorsque vos éléments "disparaissent" lorsqu'une certaine condition est FAUX.

Si telle est votre intention, vous pouvez l'ajouter à votre serveur.

output$sliderInputUI <- renderUI({
    if (condition == TRUE) {
        sliderInput("id", "text", 
             min = 1, max = 8, 
             value = 1, step = 1
        )
    }
})

Ajoutez ceci à votre ui.R htmlOutput ("sliderInputUI")

sliderInput n'apparaîtra alors dans votre interface utilisateur que lorsque la condition est VRAIE.

3
tnaake