如何在R/Shiny中使用purrr :: map创建其他面板

3

这是我的代码。

为什么它不起作用?

我认为我应该使用 do.call,但我不知道如何使用。 输出应该是前3个面板和第4个面板,总共7个面板。

有任何帮助吗?

library(shiny)
library(tidyverse)

tabpanel_function <- function(x){
  tabPanel(paste0("Panel",x))
}

ui <- fluidPage(
  
  tabsetPanel(
    tabPanel("Panela"),
    tabPanel("Panelb"),
    tabPanel("Panelc"),        
     
      1:4 %>% map(~ tabpanel_function(.x))
  )
)

server <- function(input, output, session) {
  
}

shinyApp(ui, server)

请不要在问题本身中添加“解决方案”。如果您使用的方法与下面提供的答案不同,请将您的解决方案作为单独的答案发布。社区可以投票支持他们认为最有用的方法,您可以接受任何您喜欢的答案。 - MrFlick
1个回答

2

在服务器函数中调用appendTab可能是可行的:

library(shiny)
library(tidyverse)

tabpanel_function <- function(x){
  tabPanel(paste0("Panel",x))
}

ui <- fluidPage(
  
  tabsetPanel(id = "x",
    tabPanel("Panela"),
    tabPanel("Panelb"),
    tabPanel("Panelc"),        
    
  )
)

server <- function(input, output, session) {
  1:4 %>% map(~ tabpanel_function(.x) %>% appendTab("x", .))
}

shinyApp(ui, server)

修改

我删除了之前错误的断言,即在ui构建中进行循环不起作用。请参见此处,其中展示了一种方法(使用lapply,其输出与map相同)。


1
感谢您的时间。在这种情况下,我该如何将plotOutput添加到不同的tabpanel中? - JohnBones JohnBones
嗯,有点棘手,我认为你应该使用 insertUI(https://shiny.rstudio.com/reference/shiny/latest/insertUI.html)来添加部件,或者考虑将你的闪亮应用程序模块化,以便重复添加更复杂的内容(https://shiny.rstudio.com/articles/modules.html)。 - Andy Baxter
抱歉,我之前关于无法从循环中创建UI元素的说法是完全错误的 - https://shiny.rstudio.com/gallery/creating-a-ui-from-a-loop.html。我会看看是否有适用于您代码的便捷修复方法。 - Andy Baxter
1
我更新了问题。这是我在这些新面板上包含图表。同时我验证了你的答案。再次感谢! - JohnBones JohnBones
1
哈哈,你真是太好了,给了我这些分数!很高兴最终一切都解决了,你得到了一个好的解决方案。 - Andy Baxter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接