如何用purrr::map在R/Shiny中创建多面板?代码故障求助
解决Shiny中混合固定面板与动态生成面板的问题
你当前代码的问题在于,tabsetPanel需要接收多个独立的tabPanel对象作为参数,但purrr::map(1:4, ~tabpanel_function(.x))返回的是一个包含4个tabPanel的列表,直接把这个列表放进tabsetPanel里,Shiny会把它当成一个单独的无效参数,所以无法正常渲染。
下面提供两种可行的解决方法:
方法1:使用do.call合并参数
把固定面板和动态生成的面板合并成一个参数列表,再用do.call将列表元素作为独立参数传递给tabsetPanel:
library(shiny) library(tidyverse) tabpanel_function <- function(x){ tabPanel(paste0("Panel",x)) } # 生成动态面板列表 dynamic_panels <- map(1:4, ~tabpanel_function(.x)) # 合并固定面板与动态面板为一个完整的参数列表 all_panels <- c( list(tabPanel("Panela"), tabPanel("Panelb"), tabPanel("Panelc")), dynamic_panels ) ui <- fluidPage( do.call(tabsetPanel, all_panels) ) server <- function(input, output, session) { } shinyApp(ui, server)
方法2:使用!!!解引用列表(tidyverse专属语法)
利用tidyverse的!!!操作符,直接将动态生成的列表展开为tabsetPanel的独立参数,写法更简洁:
library(shiny) library(tidyverse) tabpanel_function <- function(x){ tabPanel(paste0("Panel",x)) } ui <- fluidPage( tabsetPanel( tabPanel("Panela"), tabPanel("Panelb"), tabPanel("Panelc"), # 用!!!将动态面板列表展开为独立参数 !!!map(1:4, ~tabpanel_function(.x)) ) ) server <- function(input, output, session) { } shinyApp(ui, server)
两种方法都能让Shiny正确识别并渲染全部7个面板,根据你的习惯选择即可。
内容的提问来源于stack exchange,提问作者JohnBones JohnBones
相关产品推荐
相关产品推荐

