首页 > 解决方案 > R Shiny:删除新创建的标签

问题描述

我正在编写一个闪亮的应用程序,我希望用户能够在其中添加和删除选项卡。如果用户单击专门为此制作的选项卡,我知道如何添加选项卡(感谢此处的答案),但我不知道如何删除最后创建的选项卡。

这是一个可重现的示例:

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()),
                 tabPanel(title = "Less",
                          icon = icon("minus"),
                          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)}
    if (input$tabs == "Less"){
      count(count()+1)
      id = paste0("Name ", count())
      removeTab(inputId = "tabs",
                target = id
                )}
  })

}

shinyApp(ui = ui, server = server)

在这里,您可以看到单击选项卡More会添加一个选项卡,该选项卡以在选项卡Name ii的点击次数命名More。但是,单击选项卡Less不会执行任何操作。

我想要的是以下内容:

有人知道怎么做吗?

标签: rshiny

解决方案


我已经通过添加选择器并删除按钮然后重用选择器索引来完成此操作。为此,请使用每次按下单个按钮时计数的反应值或在交互完成时记录。

试试下面的代码:

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()),
                 tabPanel(title = "Less",
                          icon = icon("minus"),
                          fluidRow())
)

server <- function(input, output) {

  count <- reactiveValues(value = 1)

  observeEvent(input$tabs, {
    if (input$tabs == "More"){
      count$value <- count$value + 1
      id = paste0("Name ", count$value)
      insertTab(inputId = "tabs",
                tabPanel(title = id,
                         fluidRow(column(
                           width = 12))
                ), target = "More", position = "before",
                select = TRUE)}
    if (input$tabs == "Less"){
      print(count$value)
      id = paste0("Name ", count$value)
      removeTab(inputId = "tabs",
                target = id
      )

      count$value <- count$value -1
      }
  })

}

shinyApp(ui = ui, server = server)

推荐阅读