我正在尝试创建一个可根据用户输入动态调用模块的应用。在这个例子中,我有一个简单的selectInput(),默认为1,选择1和2.我想要的是,只要用户选择1,服务器就会调用"第一个" module,只有一个textInput()框,显示"你的选择是(用户输入)",或者在1的情况下,"你的选择是1"。否则,如果用户选择2,我想调用另一个模块,这是一个添加/删除按钮模块,然后调用" first"模块。本质上,selectInput()值2将与selectInput()值1相同,除了除了"第一个"的UI输出之外。模块,它将有一个添加和删除操作按钮,如果按下该按钮将调用更多的"第一个"模块ui和服务器组件。如果选择1,我可以使用它,但是对于2的selectInput(),它似乎不会调用addRmBtn模块。代码如下,谢谢!
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)
答案 0 :(得分:1)
尝试使用UI中的conditionalPanel()来调整条件以适应用户输入。
也许像
conditionalPanel(condition = "input.inp=='2'",[do second module stuff here])