能否使用lapply或循环在shiny中添加shinydashboardPlus手风琴项?
解决方案
你要的动态生成accordionItem的方案完全可行,只需要在UI的accordion()函数中使用!!!操作符将lapply生成的accordionItem列表展开为独立参数即可,因为accordion()需要接收多个独立的accordionItem作为入参,而不是一个嵌套列表。
完整可运行代码
library(shiny) library(shinydashboardPlus) library(dplyr) data(iris) # 提前提取所有类别,避免重复计算 species_vec <- unique(iris$Species) n_species <- length(species_vec) # UI ---- ui <- fluidPage( titlePanel("Hello Shiny!"), sidebarLayout( sidebarPanel( p("Some text") ), mainPanel( accordion( id = "id-accordion", # 用lapply生成所有accordionItem,再用!!!展开参数 !!!lapply(1:n_species, function(i) { accordionItem( title = species_vec[i], tableOutput(paste0("table", i)) ) }) ) ) ) ) server <- function(input, output) { lapply(1:n_species, function(i){ outputId <- paste0("table", i) output[[outputId]] <- renderTable({ iris %>% filter(Species == species_vec[i]) %>% select(Sepal.Length, Sepal.Width) }) }) } shinyApp(ui, server)
关键修改说明
- 提前提取分类向量
species_vec,避免重复调用unique(iris$Species),代码可维护性更高,后续如果分类数量变化也不需要手动修改循环次数 - 使用
!!!(rlang包的注入操作符,shiny环境默认支持)将lapply返回的列表拆分为独立参数传入accordion(),即可实现完全动态生成手风琴项 - 新增
dplyr包加载声明,原代码中使用的filter()、select()均为dplyr函数,未加载会运行报错
内容的提问来源于stack exchange,提问作者Ainhoa
相关产品推荐
相关产品推荐

