【问题标题】:How to create dynamic tabSetPanels with the same selected tab that reacts to user input in R Shiny?如何使用对 R Shiny 中的用户输入做出反应的相同选定选项卡创建动态 tabSetPanels?
【发布时间】:2021-11-18 21:43:26
【问题描述】:

我的应用包含两个基于用户输入创建的 tabSetPanel(在下面的示例中,用户输入是一组单选按钮)。用户输入确定两个 tabSetPanels 所选选项卡中的选项卡数量。我还希望两个 tabSetPanel 在用户输入更改或在任一集中选择不同的选项卡时显示相同的选项卡。原始应用程序包含阻止我合并两个 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)
}

提前致谢

【问题讨论】:

    标签: r shiny shinyapps


    【解决方案1】:
    • 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 设置。

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

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 2018-03-23
      • 2018-07-29
      • 2020-10-14
      • 1970-01-01
      • 2015-10-22
      • 2017-07-20
      • 1970-01-01
      • 2016-10-02
      相关资源
      最近更新 更多