【问题标题】:R Shiny: name tabPanel with the number of clicksR Shiny:使用点击次数命名 tabPanel
【发布时间】:2019-10-22 20:08:36
【问题描述】:

我正在创建一个应用程序,用户可以通过单击专用于它的 tabPanel 来创建新的 tabPanels。我知道该怎么做,但我不知道如何用反应数字命名 tabPanels。

为了更清楚,这里有一个可重现的例子:

library(shiny)
library(shinyWidgets)

ui <- navbarPage(position = "static-top",
                 title = "foo",
                 id = "tabs",
                 tabPanel(title = "Name 1",
                          fluidRow()),
                 tabPanel(title = "More",
                          icon = icon("plus"),
                          fluidRow()
                          )
                 )


server <- function(input, output) {

  count <- reactive({
    i <- 1
      if (input$tabs == "More"){
        i <- i + 1
      }
      else {i <- i}
    i
  })

  observeEvent(input$tabs, {
    id = paste0("Name ", count())
    if (input$tabs == "More")
    appendTab(inputId = "tabs",
              tabPanel(title = id,
                       fluidRow(column(
                         width = 12))
              ),
              select = TRUE)
  })

}


shinyApp(ui = ui, server = server)

如您所见,单击 tabPanel More 会创建一个新的 tabPanel。我希望 tabPanel 的名称采用“名称 i”的形式,其中“i”是现有的 tabPanel 的数量(- 1 因为我不想考虑 tabPanel More 和 + 1 以防止出现开始时相同数字的两倍)。因此,我需要这个“i”是响应式的,因为它必须考虑到用户创建的 tabPanel。

在我的代码中,您可以看到我尝试通过计算 tabPanel More 上的点击次数来计算 tabPanel 的数量,但这不起作用。我看到了this post,但我不知道如何修改它,因为我从未使用过 JavaScript。

有人有解决办法吗?

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    您可以将count() 设为reactiveVal 来解决此问题:

    此外,您可能希望使用insertTab 而不是appendTab 来保留右侧的“更多”选项卡:

    library(shiny)
    library(shinyWidgets)
    
    ui <- navbarPage(position = "static-top",
                     title = "foo",
                     id = "tabs",
                     tabPanel(title = "Name 1",
                              fluidRow()),
                     tabPanel(title = "More",
                              icon = icon("plus"),
                              fluidRow()
                     )
    )
    
    
    server <- function(input, output) {
    
      count <- reactiveVal(1)
    
      observeEvent(input$tabs, {
        if (input$tabs == "More"){
          count(count()+1)
          id = paste0("Name ", count())
          insertTab(inputId = "tabs",
                    tabPanel(title = id,
                             fluidRow(column(
                               width = 12))
                    ), target = "More", position = "before",
                    select = TRUE)}
      })
    
    }
    
    
    shinyApp(ui = ui, server = server)
    

    【讨论】: