2017-10-10 2 views
0

J'essaie de créer une application qui appellera les modules de façon dynamique en fonction de l'entrée de l'utilisateur. Dans cet exemple, j'ai un simple selectInput() par défaut à 1, avec les choix 1 et 2. Ce que je veux c'est que chaque fois que l'utilisateur sélectionne 1, le serveur appelle un "premier" module, qui a juste un textInput() boîte qui affiche "Votre sélection est (entrée utilisateur)", ou dans le cas de 1, "Votre sélection est 1". Sinon, si l'utilisateur sélectionne 2, je souhaite appeler un module différent, qui est un module de bouton ajouter/supprimer, qui à son tour appelle le module "premier". Essentiellement, selectInput() valeur de 2 fera la même chose que selectInput() valeur de 1, sauf qu'en plus de la sortie de l'interface utilisateur du "premier" module, il aura un bouton d'action ajouter et supprimer qui, si pressé appellera plus du "premier" module ui et des composants du serveur. Je le fais fonctionner si 1 est sélectionné, mais pour selectInput() de 2, il ne semble pas appeler le module addRmBtn. Code ci-dessous, merci!R Shiny: appel dynamique de modules en fonction de l'entrée de l'utilisateur

library(shiny) 

firstUI <- function(id) { uiOutput(NS(id, "first")) } 

firstServer <- function(input, output, session, inData) { 
    ns = session$ns 

    output$first <- renderUI({ 
     textInput(ns("selection"), ns("selection"), value = paste0("Your selection is ", inData)) 
    }) 

} 

removeFirstUI <- function(id) { 
    removeUI(selector = paste0('#', NS(id, "first"))) 
} 

addRmBtnUI <- function(id) { 
    ns <- NS(id) 

    tags$div(
    actionButton(inputId = ns('insertParamBtn'), label = "Add"), 
    actionButton(ns('removeParamBtn'), label = "Remove"), 
    hr(), 
    tags$div(id = ns('placeholder')) 
) 
} 

addRmBtnServer <- function(input, output, session, moduleToReplicate, ...) { 
    ns = session$ns 

    params <- reactiveValues(btn = 0) 

    observeEvent(input$insertParamBtn, { 
     params$btn <- params$btn + 1 

     callModule(moduleToReplicate$server, id = params$btn, ...) 
     insertUI(
      selector = paste0('#', ns('placeholder')), 
      ui = moduleToReplicate$ui(ns(params$btn)) 
      ) 
      }) 

    observeEvent(input$removeParamBtn, { 
     moduleToReplicate$remover(ns(params$btn)) 
     params$btn <- params$btn - 1 
    }) 
} 

ui <- fluidPage(
    #addRmBtnUI("addRm"), 
    column(12, selectInput("inp", label = "Select", choices = list(1, 2), selected = 1)), 
    column(12, uiOutput("inpChoice")) 
)      

server <- function(input, output, session) { 

    observeEvent(input$inp, { 
     if (input$inp == 1) { 
      callModule(firstServer, id = 0, inData = input$inp) 
      output$inpChoice <- renderUI({ firstUI(0) }) 
     } else { 
      callModule(addRmBtnServer, 
       id = "inpChoice", 
       moduleToReplicate = list(
        ui = firstUI, 
        server = firstServer, 
        remover = removefirstIU 
        ), 
       inData = input$inp 
       ) 

      } 

     }) 
} 

shinyApp(ui = ui, server = server) 

Répondre

1

Essayez d'utiliser un conditionalPanel() dans l'interface utilisateur d'adapter les conditions à l'entrée d'utilisateur.

Peut-être quelque chose comme

conditionalPanel(condition = "input.inp=='2'",[do second module stuff here])