Добавление произвольного количества tabPanel в tabsetPanel на блестящей панели инструментов

Я пытаюсь сделать 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)

person Vitor Hugo Moreau    schedule 29.06.2021    source источник


Ответы (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)
person jpdugo17    schedule 29.06.2021
comment
Ух ты! это очень умное решение. Пришлось искать, чтобы понять оператор !!!. Спасибо!!! - person Vitor Hugo Moreau; 30.06.2021

Кажется, я не могу точно определить вашу ошибку. Однако ответ есть здесь.

Я соответствующим образом изменил ваш код, и он работает как задумано. См. ниже,

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)
person Serkan    schedule 29.06.2021
comment
Это сработало очень хорошо. Спасибо. Я собираюсь изучить код, чтобы выяснить, что я сделал не так, а что вы сделали правильно. - person Vitor Hugo Moreau; 30.06.2021