R 使用操作按钮删除选项卡

R 使用操作按钮删除选项卡,r,shiny,R,Shiny,我有一个闪亮的应用程序,一旦你点击一个标记并跳入其中,它就会打开一个标签。现在,您可以返回到“地图”选项卡,单击另一个标记,打开另一个选项卡,依此类推。我希望能够删除所有打开的标签与行动按钮 下面是一个小示例代码,您可以在单击标记后添加并跳转到选项卡中,但操作按钮删除详细信息选项卡不起作用 library(shiny) library(leaflet) library(shinydashboard) library(purrr) pts <- data.frame( id= lett

我有一个闪亮的应用程序,一旦你点击一个标记并跳入其中,它就会打开一个标签。现在,您可以返回到“地图”选项卡,单击另一个标记,打开另一个选项卡,依此类推。我希望能够删除所有打开的标签与行动按钮

下面是一个小示例代码,您可以在单击标记后添加并跳转到选项卡中,但操作按钮
删除详细信息选项卡
不起作用

library(shiny)
library(leaflet)
library(shinydashboard)
library(purrr)

pts <- data.frame(
  id= letters[seq( from = 1, to = 10 )],
  x = rnorm(10, mean = -93.625), 
  y = rnorm(10, mean = 42.0285)
)


ui <- fluidPage(
  dashboardSidebar(

    actionLink("remove", "Remove detail tabs")),

  tabsetPanel(id='my_tabsetPanel',
              tabPanel('Map1',
                       leafletOutput('map1')   
              )))



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

  output$map1 <- renderLeaflet({
    leaflet() %>% 
      addTiles() %>% 
      setView(-93.65, 42.0285, zoom = 6)
  })


  observe({        
    input$my_tabsetPanel        
    tab1 <- leafletProxy('map1', data = pts) %>%
      clearMarkers() %>% 
      addCircleMarkers(lng = ~x, lat = ~y, radius = 4, layerId = ~id)   

  })


  observeEvent(input$map1_marker_click, { 
    tab_title <- input$map1_marker_click[1]
    appendTab(inputId = "my_tabsetPanel",
              tabPanel(
                tab_title, #paste0("tab_",tab_title),
                value = paste0("tab_",tab_title),
                fluidRow(                      
                  box('test')
                )))

    tab_list <<- c(tab_list, tab_title)        
    updateTabsetPanel(session, "my_tabsetPanel", selected = paste0("tab_",tab_title))       
  })
  observeEvent(input$remove,{
    print(tab_list)
    tab_list %>%
      walk(~removeTab("my_tabsetPanel", .x))
      tab_list <<- NULL
  })

}
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(单张)
图书馆(shinydashboard)
图书馆(purrr)
ptsOk,因此带有选项multiple=TRUE的removeUI()函数将删除除第一个之外的所有列表元素(在本例中,映射选项卡本身)

库(闪亮)
图书馆(单张)
图书馆(shinydashboard)
图书馆(purrr)

pts好吧,我真的找到了一个方法。您需要在tab title name元素周围使用
paste()
。为什么?我不知道

下面的服务器部件与上面的UI结合在一起就可以工作了

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

  output$map1 <- renderLeaflet({
    leaflet() %>% 
      addTiles() %>% 
      setView(-93.65, 42.0285, zoom = 6)
  })


  observe({        
    input$my_tabsetPanel        
    tab1 <- leafletProxy('map1', data = pts) %>%
      clearMarkers() %>% 
      addCircleMarkers(lng = ~x, lat = ~y, radius = 4, layerId = ~id)   

  })


  observeEvent(input$map1_marker_click, { 
    clickedMarker <- input$map1_marker_click[1]
    tab_title <- paste(clickedMarker) #add paste() here and it works      

    appendTab(inputId = "my_tabsetPanel",
              tabPanel(
                tab_title,
                fluidRow(                      
                  box('test')
                )))

    tab_list <<- c(tab_list, tab_title) 


    updateTabsetPanel(session, "my_tabsetPanel", selected = tab_title)       
  })


  observeEvent(input$remove,{
    print(tab_list)
    tab_list %>%
      walk(~removeTab("my_tabsetPanel", .x))
    tab_list <<- NULL
  })

}
server%
addCircleMarkers(lng=~x,lat=~y,radius=4,layerId=~id)
})
observeEvent(输入$map1_marker_单击,{

clickedMarker你说的是工作示例链接吗?是的,它在那里工作,但不在我的示例中哦,糟糕。我没有注册它!不知道,但是removeUI()是一个简单有效的解决方案,所以为什么不使用它:)哦,刚才看到一旦打开多个选项卡,它们不会立即被删除我相信removeUI()的功能它在点击按钮时一次删除一个元素。是的,这有点有效,但我在工作示例链接中寻找类似的东西,您可以在一次点击中删除所有选项卡。实际上很简单,只需在最后一个
removeUI
部分之后添加一个
updateTablePanel(会话,“my_tabsetPanel”,selected='Map1')
library(shiny)
library(leaflet)
library(shinydashboard)
library(purrr)

pts <- data.frame(
  id= letters[seq( from = 1, to = 10 )],
  x = rnorm(10, mean = -93.625), 
  y = rnorm(10, mean = 42.0285)
)


ui <- fluidPage(
  dashboardSidebar(

    actionLink("remove", "Remove detail tabs")),

  tabsetPanel(id='my_tabsetPanel',
              tabPanel('Map1',
                       leafletOutput('map1')   
              )))



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

  output$map1 <- renderLeaflet({
    leaflet() %>% 
      addTiles() %>% 
      setView(-93.65, 42.0285, zoom = 6)
  })


  observe({        
    input$my_tabsetPanel        
    tab1 <- leafletProxy('map1', data = pts) %>%
      clearMarkers() %>% 
      addCircleMarkers(lng = ~x, lat = ~y, radius = 4, layerId = ~id)   

  })


  observeEvent(input$map1_marker_click, { 
    tab_title <- input$map1_marker_click[1]
    appendTab(inputId = "my_tabsetPanel",
              tabPanel(
                tab_title, #paste0("tab_",tab_title),
                value = paste0("tab_",tab_title),
                fluidRow(                      
                  box('test')
                )))

    tab_list <<- c(tab_list, tab_title)        
    updateTabsetPanel(session, "my_tabsetPanel", selected = paste0("tab_",tab_title))       
  })
  observeEvent(input$remove,{
    removeUI(
      selector = "ul>li:nth-child(n+2)",
      multiple = TRUE
    )
    removeUI(
      selector = "div.box-body",
      multiple = TRUE
    )
  })

}
shinyApp(ui = ui, server = server)
server <- function(input, output, session) {
  tab_list <- NULL

  output$map1 <- renderLeaflet({
    leaflet() %>% 
      addTiles() %>% 
      setView(-93.65, 42.0285, zoom = 6)
  })


  observe({        
    input$my_tabsetPanel        
    tab1 <- leafletProxy('map1', data = pts) %>%
      clearMarkers() %>% 
      addCircleMarkers(lng = ~x, lat = ~y, radius = 4, layerId = ~id)   

  })


  observeEvent(input$map1_marker_click, { 
    clickedMarker <- input$map1_marker_click[1]
    tab_title <- paste(clickedMarker) #add paste() here and it works      

    appendTab(inputId = "my_tabsetPanel",
              tabPanel(
                tab_title,
                fluidRow(                      
                  box('test')
                )))

    tab_list <<- c(tab_list, tab_title) 


    updateTabsetPanel(session, "my_tabsetPanel", selected = tab_title)       
  })


  observeEvent(input$remove,{
    print(tab_list)
    tab_list %>%
      walk(~removeTab("my_tabsetPanel", .x))
    tab_list <<- NULL
  })

}