可以访问导航容器中包含的nav_panel()对象的名称。在下面的示例中,我想动态删除所有面板,如果我知道n ...

问题描述 投票:0回答:1
panel_names<-c("a", "b", "c")

。但是,在较大的应用程序中,这些面板是动态生成的,我可能不知道面板的名称

library(shiny)
library(bslib)
library(purrr)

ui <- fluidPage(
  
  actionButton("remove", "Remove all nav panels"),
  tabsetPanel(
    id="panel_set",
    nav_panel("a", "frame a"),
    nav_panel("b", "frame b"),
    nav_panel("c", "frame c")
  )
)

server <- function(input, output) {
  observe({
    panel_names = c("a", "b", "c") # How can I replace this line?
    walk(panel_names, \(pn) nav_remove("panel_set", target=pn))
  }) |> bindEvent(input$remove)
}

# Run the application 
shinyApp(ui = ui, server = server)

我如何替换线

panel_names<-c("a", "b", "c")

    

您可以使用

custom消息处理程序
r shiny bslib
1个回答
0
投票
library(shiny) library(bslib) library(purrr) ui <- page_fluid( tags$head( tags$script(" Shiny.addCustomMessageHandler('get_nav_panel_names', function(panel) { var names = $('#' + panel).find('a').map(function() { return $(this).attr('data-value'); }).toArray(); Shiny.setInputValue(panel + '_names', {names}); }); ") ), actionButton("remove", "Remove all nav panels"), tabsetPanel( id="panel_set", nav_panel("a", "frame a"), nav_panel("b", "frame b"), nav_panel("c", "frame c") ) ) server <- function(input, output, session) { observeEvent(input$remove, { session$sendCustomMessage("get_nav_panel_names", "panel_set") req(input$panel_set_names) panel_names <- unlist(unname(input$panel_set_names)) walk(panel_names, \(pn) nav_remove("panel_set", target=pn)) }, ignoreNULL = FALSE) } # Run the application shinyApp(ui = ui, server = server)

在这里无关,但请注意,我用Bslib的fluidPage

page_fluid
取代了Shiny's。


最新问题
© www.soinside.com 2019 - 2024. All rights reserved.