首页 文章

R Shiny:根据用户输入动态调用模块

提问于
浏览
0

我正在尝试创建一个应用程序,它将根据用户输入动态调用模块 . 在这个例子中,我有一个简单的selectInput()默认为1,选择1和2.我想要的是用户选择1的任何时候,服务器调用一个“first”模块,它只有一个textInput()显示“您的选择是(用户输入)”的框,或者在1的情况下,“您的选择是1” . 否则,如果用户选择2,我想调用另一个模块,这是一个添加/删除按钮模块,后者又调用“第一”模块 . 本质上,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)

1 回答

  • 1

    尝试在UI中使用conditionalPanel()以使条件适应用户输入 .

    也许是这样的

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

相关问题