R Shiny模块:输入未使用callModule

时间:2017-04-04 00:12:16

标签: r module shiny

我一直在寻找,但找不到我的问题的答案。我构建了一个简单的应用程序来演示我的问题。基本上,问题是我试图在模块服务器中使用renderUI在模块UI中有条件地创建uiOutput。我添加了一些print语句,这些语句让我相信renderUI在未更新input的情况下进行评估。我无法理解这一点,这让我很难过,我很感激任何帮助!

示例代码:

library(shiny) # shiny_1.0.0
library(DT) # DT_0.2

testModuleUI <- function(id) {
  ns = NS(id)

  tagList(
    br(),
    sidebarPanel(width = 12, id = "inputBar",
                 fluidRow(
                   column(width = 2, checkboxInput(ns("buttonA"), label = "Button A", value = F)),
                   column(width = 2, uiOutput(ns("getButtonB")))
                 ),
                 dataTableOutput(outputId = ns("tableOutput"))
    )
  )
}

testModule <- function(input, output, session, showB = F ){
  ns = session$ns

  output$getButtonB <- renderUI({
    if( showB ){
      print("call checkboxInput")
      checkboxInput(ns("buttonB"), label = "Button B", value = F)
    }else{
      NULL
    }
  })

  getTable <- reactive({
    print("inside getTable")
    out = c()

    if( input$buttonA ) {
      out = paste0(out, "A")
    } 

    if( input$buttonB ){
      out = paste0(out, "B")
    }

    data.frame(var = out)
  })

  output$tableOutput <- renderDataTable({
    print("call getTable")
    datatable( getTable() )
  })

}


server <- function(input, output, session) {

  callModule( module = testModule, id = "test1", showB = T )

  session$onSessionEnded( stopApp )
}


ui <- pageWithSidebar(

  headerPanel( title = "Test app" ),

  sidebarPanel(
    width = 3,
    selectInput(inputId = "whatever", label = "This button doesn't matter", choices = c("A", "B"))
  ),

  mainPanel(
    tabsetPanel(
      tabPanel("Tab 1", testModuleUI("test1"))
    )
  )
)

shinyApp( ui = ui, server = server, options = list(launch.browser = T)

谢谢!

0 个答案:

没有答案