You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:06:03