如何使用对 R Shiny 中的用户输入做出反应的相同选定选项卡创建动态 tabSetPanels?

How to create dynamic tabSetPanels with the same selected tab that reacts to user input in R Shiny?

我的应用程序包含两个基于用户输入创建的 tabSetPanel(在下面的示例中,用户输入是一组单选按钮)。用户输入决定了 tabSetPanels AND 中的选项卡数量。我还希望两个 tabSetPanels 在用户输入更改或在任一组中选择不同的选项卡时显示相同的选项卡。原始应用程序包含阻止我合并两个 tabSetPanel 的功能。问题是两个 tabSetPanel 最初都显示没有任何内容的选项卡。 这是一个最小的可重现示例:

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      # User input for number of tabs and selected tab
      radioButtons("tabSelector", "Select Number of Tabs", 1:3, 1),
      br()
    ),
    mainPanel(
      uiOutput(
        "set1"
      ),
      uiOutput(
        "set2"
      )
    )
  )
)

server <- function(input, output, sesstion){
  
  output$set1 <- renderUI({
    tabs <- list()
    for(i in seq_len(input$tabSelector)){
      tabs[[i]] <- tabPanel(
        title = paste0("tab",i),
        value = i,
        numericInput(
          paste0("num",i),
          "Number",
          value = 0
        )
      )
    }
    do.call(tabsetPanel, c(tabs,
                           list(id = "set1",
                                selected = input$tabSelector)))
  })
  
  output$set2 <- renderUI({
    tabs <- list()
    for(i in seq_len(input$tabSelector)){
      tabs[[i]] <- tabPanel(
        title = paste0("tab",i),
        value = i,
        numericInput(
          paste0("num",i),
          "Number",
          value = 0
        )
      )
    }
    do.call(tabsetPanel, c(tabs,
                           list(id = "set2",
                                selected = input$tabSelector)))
  })
  
  # Bind the two tabSetPanels
  observeEvent(input$set1, {
    updateTabsetPanel(inputId = "set2", selected = input$set1)
  })
  observeEvent(input$set2,{
    updateTabsetPanel(inputId = "set1", selected = input$set2)
  })
  
} # end server function

if (interactive()) {
  shinyApp(ui, server)
}

提前致谢

  • 一个tabPanel的值必须是字符串:

    output$set1 <- renderUI({
      tabs <- list()
      for(i in seq_len(input$tabSelector)){
        tabs[[i]] <- tabPanel(
          title = paste0("tab",i),
          value = as.character(i),
          numericInput(
            paste0("num",i),
            "Number",
            value = 0
          )
        )
      }
      do.call(tabsetPanel, c(tabs,
                             list(id = "set1",
                                  selected = as.character(input$tabSelector))
      ))
    })
    
  • output$set2中你不需要设置selected参数的值,因为它将由updateTabsetPanel.[=16设置=]

  • HTML 中不允许重复 ID,因此您必须将数字输入的 ID paste0("num",i) 更改为两个选项卡集之一中的其他内容。