将自定义数量的 tabPanel 添加到闪亮仪表板中的 tabsetPanel

时间:2021-06-29 21:56:02

标签: r shiny dashboard tabpanel

我正在尝试使用基于变量 tabsetPanel 的多个 tabPanel 来创建 form。我已经尝试了下面的代码,但出现了一些错误:

<块引用>

attr(x, "selected") 中的错误 <- TRUE : 试图在 NULL 中指定一个属性

有人可以帮助我好吗?

library(shinydashboard)
library(tidyverse)

form <- 2

ui <- dashboardPage(
    title = "Rolê de Aventura", skin="blue",
    dashboardHeader(titleWidth = 1024,
                    title=list(title=tags$img(src="LogoPQ.png",
                                              heigth=45, width=45,
                                              align="left"),
                               title=tags$p(style="text-align:center;",
                                            "Rolê de Aventura")
                    )
    ),
    dashboardSidebar(
        selectInput("categoria", label = "Categoria:",
                    choices = list("Quarteto Misto",
                                   "Dupla Masculina",
                                   "Dupla Mista",
                                   "Dupla Feminina"), width="200px"
        )
    ),
    dashboardBody(
        textInput("equipe", "Nome da equipe:", width = NULL),
        tabsetPanel(width = NULL, type = "tabs",
                    do.call(tabsetPanel,c(width=NULL, type="tabs",
                                           lapply(1:form, function(i) {
                                               tabPanel(title = str_c("Atleta", i),
                                                        textInput(str_c("atleta", i), "Nome:", width=NULL),
                                                        dateInput(str_c("at.nasc", i), "Nascimento:", width="30%"),
                                                        checkboxGroupInput(str_c("at.sex", i), "Sexo:", width="30%",
                                                                           choices=list("Masculino", "Feminino")))
                                           })
                    )
                    )
        )
    )
)

server <- function(input, output) {
}

shinyApp(ui = ui, server = server)

2 个答案:

答案 0 :(得分:3)

我似乎无法准确识别您的错误。然而,有一个答案here

我已经相应地修改了您的代码,它按预期工作。见下文,

library(shinydashboard)
library(tidyverse)
library(shiny)

form <- 2

ui <- dashboardPage(
        title = "Rolê de Aventura", skin="blue",
        dashboardHeader(titleWidth = 1024,
                        title=list(title=tags$img(src="LogoPQ.png",
                                                  heigth=45, width=45,
                                                  align="left"),
                                   title=tags$p(style="text-align:center;",
                                                "Rolê de Aventura")
                        )
        ),
        dashboardSidebar(
                selectInput("categoria", label = "Categoria:",
                            choices = list("Quarteto Misto",
                                           "Dupla Masculina",
                                           "Dupla Mista",
                                           "Dupla Feminina"), width="200px"
                )
        ),
        dashboardBody(
                textInput("equipe", "Nome da equipe:", width = NULL),
                do.call(
                        tabsetPanel,
                        c(
                                id = "t",
                                lapply(
                                        1:form,
                                        FUN = function(x) {
                                                tabPanel(
                                                        title = paste("tab", x)
                                                )
                                                
                                        }
                                )
                        )
                )
        )
)

server <- function(input, output) {
}

shinyApp(ui = ui, server = server)

答案 1 :(得分:2)

我发现在这种情况下将 exec() 函数与 !!! 一起使用很有用。

library(shinydashboard)
library(tidyverse)
library(shiny)

form <- 2

#store the ui code in a list to use later.

tabs <- map(1:form, function(i) {
          tabPanel(title = str_c("Atleta", i),
                   textInput(str_c("atleta", i), "Nome:"),
                   dateInput(str_c("at.nasc", i), "Nascimento:", width="30%"),
                   checkboxGroupInput(str_c("at.sex", i), "Sexo:", width="30%",
                                      choices=c("Masculino", "Feminino")))
        })

ui <- dashboardPage(
  title = "Rolê de Aventura", skin="blue",
  dashboardHeader(titleWidth = 1024,
                  title=list(title=tags$img(src="LogoPQ.png",
                                            heigth=45, width=45,
                                            align="left"),
                             title=tags$p(style="text-align:center;",
                                          "Rolê de Aventura")
                  )
  ),
  dashboardSidebar(
    selectInput("categoria", label = "Categoria:",
                choices = list("Quarteto Misto",
                               "Dupla Masculina",
                               "Dupla Mista",
                               "Dupla Feminina"), width="200px"
    )
  ),
  dashboardBody(
    textInput("equipe", "Nome da equipe:"),
    exec(tabsetPanel, !!!tabs))
    )


server <- function(input, output) {
}

shinyApp(ui = ui, server = server)