我正在嘗試創建一個應用程序,根據用戶輸入動態調用模塊。在這個例子中,我有一個簡單的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)