Создайте панель вкладок Shinydashboard на основе столбца данных - PullRequest
2 голосов
/ 03 апреля 2020

Ниже я отображаю 2 попытки. У меня есть блестящая приборная панель с tabPanels. Я хотел бы создать tabPanels tabPanel Data автоматически на основе кадра данных Uni. В моей первой попытке ниже эти tabPanels закомментированы, чтобы прояснить, что я имею в виду.

  Uni<-data.frame(NAME=c("A","B","C"))

# app.R ##
library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyjs)

dbHeader <- dashboardHeaderPlus(

  title = "Tabs"
)

ui <- dashboardPagePlus(
  dbHeader,
  dashboardSidebar(),
  dashboardBody(
    useShinyjs(),
    tags$hr(),
    tabsetPanel(
      id ="tabA",
      type = "tabs",
      tabPanel("Front",icon = icon("accusoft")),
      tabPanel("Data", icon = icon("table"),
               tabsetPanel(
                 id ="tabA",
                 type = "tabs",
                 for(i in 1:nrow(Uni)){
                   tabPanel(
                     paste0(Uni[i,1])
                     ,icon = icon("table"))
                 }
                 #tabPanel("A",icon = icon("table")),
                 #tabPanel("B", icon = icon("table")),
                 #tabPanel("C", icon = icon("table"))

               )

      )
    )
  )

)

server <- function(input, output) {

}

shinyApp(ui = ui, server = server)

и моя вторая попытка:

# app.R ##
library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyjs)

dbHeader <- dashboardHeaderPlus(

  title = "Tabs"
)

ui <- dashboardPagePlus(
  dbHeader,
  dashboardSidebar(),
  dashboardBody(
    useShinyjs(),
    tags$hr(),
    tabsetPanel(
      id ="tabA",
      type = "tabs",
      tabPanel("Front",icon = icon("accusoft")),
      tabPanel("Data", icon = icon("table"),
               tags$hr(),
               tabsetPanel(
                 id ="tabA",
                 type = "tabs",
                 uiOutput("panels")

                 #tabPanel("A",icon = icon("table")),
                 #tabPanel("B", icon = icon("table")),
                 #tabPanel("C", icon = icon("table"))

               )

      )
    )
  )

)

server <- function(input, output) {
  output$panels <- renderUI({
    pan = lapply(1:length(Uni), function(i) 
      tabPanel(Uni[i,1],icon = icon("table")))
    do.call(tabBox,pan)
  })
}

shinyApp(ui = ui, server = server)

1 Ответ

1 голос
/ 03 апреля 2020

Вы должны написать весь tabSetPanel в операторе do.call. tabSetPanels никогда не слушает список объектов.

Uni<-data.frame(NAME=c("A","B","C"))

# app.R ##
library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyjs)

dbHeader <- dashboardHeaderPlus(

  title = "Tabs"
)

ui <- dashboardPagePlus(
  dbHeader,
  dashboardSidebar(),
  dashboardBody(
    useShinyjs(),
    tags$hr(),
    tabsetPanel(
      id ="tabA",
      type = "tabs",
      tabPanel("Front",icon = icon("accusoft")),
      tabPanel("Data", icon = icon("table"),
               do.call(tabsetPanel, 
                       c(id='tabA', 
                         type="tabs",
                         lapply(1:nrow(Uni), function(i) {
                           tabPanel(Uni[i,],icon = icon("table"))
                         }))
                       )
               )
      )
    )
  )

server <- function(input, output) {

}

shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...