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消息处理程序
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。