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

时间:2017-10-10 23:02:43

标签: r shiny

我正在尝试创建一个可根据用户输入动态调用模块的应用。在这个例子中,我有一个简单的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)

1 个答案:

答案 0 :(得分:1)

尝试使用UI中的conditionalPanel()来调整条件以适应用户输入。

也许像

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