2017-10-10 72 views
0

我正在嘗試創建一個應用程序,根據用戶輸入動態調用模塊。在這個例子中,我有一個簡單的selectInput(),默認爲1,選擇1和2.我想要的是任何時候用戶選擇1,服務器調用一個「第一個」模塊,它只有一個textInput()框中顯示「您的選擇是(用戶輸入)」,或在1的情況下,「您的選擇是1」。否則,如果用戶選擇2,我想調用一個不同的模塊,這是一個添加/刪除按鈕模塊,該模塊又調用「第一個」模塊。實質上,它的selectInput()值爲2將執行與selectInput()值1相同的操作,除了除了「first」模塊的UI輸出之外,它還會有一個添加和移除操作按鈕,如果按下它將調用更多「第一個」模塊UI和服務器組件。如果選擇了1,我就可以工作,但對於2的selectInput(),它似乎沒有調用addRmBtn模塊。代碼如下,謝謝!R Shiny:根據用戶輸入動態調用模塊

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) 

回答

1

嘗試在UI使用conditionalPanel()適應的條件的用戶輸入。

也許像

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

相關問題