2017-10-10 23 views
0

ユーザーの入力に応じて動的にモジュールを呼び出すアプリケーションを作成しようとしています。この例では、選択肢1と2を使用して、デフォルトで1に設定されている単純なselectInput()を使用しています。ユーザーが1を選択すると、サーバーはtextInput() 「あなたの選択は(ユーザー入力)」と表示され、「1」の場合は「あなたの選択は1」と表示されます。それ以外の場合は、ユーザーが2を選択した場合、追加/削除ボタンモジュールである別のモジュールを呼び出して「最初の」モジュールを呼び出します。基本的に、selectInput()の値2は、selectInput()の値1と同じことを行いますが、「最初の」モジュールの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])

のようなもの
関連する問題