ユーザーの入力に応じて動的にモジュールを呼び出すアプリケーションを作成しようとしています。この例では、選択肢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)