简体   繁体   English

在 tabItem() 中动态创建 box()

[英]Dynamically Create box() within tabItem()

I'm building a shiny app with shinydashboard .我正在使用shinydashboard构建一个shiny应用程序。 Its purpose is to display a set of 'cards' (technically box() elements) within each tabItem() (ie each page of the dashboard).其目的是在每个tabItem() (即仪表板的每个页面)内显示一组“卡片”(技术上是box()元素)。 The app is driven by an external.csv file (in this reprex the object dat ) which (1) defines the pages within the app and (2) specifies the number of box() elements within each page.该应用程序由 external.csv 文件(在此表示中为 object dat )驱动,该文件 (1) 定义应用程序内的页面,(2) 指定每个页面内box()元素的数量。

I have been able to successfully create a set of tabItem 's (ie pages) using category in dat .我已经能够使用dat中的类别成功创建一组tabItem (即页面)。 From here, I can't figure out how to dynamically add the correct number of boxes to each tabItem .从这里开始,我无法弄清楚如何为每个tabItem动态添加正确数量的框。 If you inspect dat you will see that there are two categories (pages): blue and green.如果您检查dat ,您将看到有两个类别(页面):蓝色和绿色。 The blue category requires me to render two boxes (Box A and Box B) whereas the green category requires me to render boxes C - E. Thus, the page called 'Blue' should render two boxes, while the page called 'Green' should render three boxes.蓝色类别需要我渲染两个框(框 A 和框 B),而绿色类别需要我渲染框 C - E。因此,名为“蓝色”的页面应该呈现两个框,而名为“绿色”的页面应该渲染三个盒子。

Could someone help me with the below code so that the correct boxes are rendered for the correct pages?有人可以帮助我使用以下代码,以便为正确的页面呈现正确的框吗? Extra gratitude if the box_name and box_desc can appear as the box() title and contents, respectively!如果 box_name 和 box_desc 可以分别作为box()的标题和内容出现,则更加感谢!

library(shiny)
library(shinydashboard)

dat<-tibble::tibble(category = c("blue", "blue", "green", "green", "green"), 
                    box_name = c("Box A", "Box B", "Box C", "Box D", "Box E"),
                    box_desc = c("Foo", "Bar", "Bar", "Foo", "Foo"))

sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem("Blue", tabName = "blue", icon = icon("dashboard")),
    menuItem("Green", icon = icon("th"), tabName = "green")
  )
)

body <- dashboardBody(
  uiOutput("render_reports")
)
header<-dashboardHeader()

ui <- dashboardPage(header, sidebar, body)

server <- function(input, output) {
  
  output$render_reports <- renderUI({
    
    pages <- lapply(unique(dat$category), function(name){
      
      tabItem(tabName = name, fluidRow(box(
        title = name, paste0("Something here about ", name), width = 12, solidHeader = TRUE, status = "primary"
      )),

      fluidRow(
        
        box(title = "box_title here", "box_desc here")
        
      ))
    })
    
    items <- c(pages)
    do.call(tabItems, items)
    
  })
  
}


shinyApp(ui, server)

Is renderUI required?需要renderUI吗?

It works fine (and is faster) without renderUI :没有renderUI它可以正常工作(并且速度更快):

library(shiny)
library(shinydashboard)

dat <- tibble::tibble(
  category = c("blue", "blue", "green", "green", "green"),
  box_name = c("Box A", "Box B", "Box C", "Box D", "Box E"),
  box_desc = c("Foo", "Bar", "Bar", "Foo", "Foo")
)

sidebar <- dashboardSidebar(sidebarMenu(
  menuItem("Blue", tabName = "blue", icon = icon("dashboard")),
  menuItem("Green", tabName = "green", icon = icon("th"))
))

body <- dashboardBody({
  items <- lapply(unique(dat$category), function(name) {
    tabItem(tabName = name, fluidRow(
      lapply(which(dat$category %in% name), function(i) {
        box(
          dat$box_desc[i],
          title = dat$box_name[i],
          paste0("Something here about ", name),
          width = 12,
          solidHeader = TRUE,
          status = "primary"
        )
      }))
    )})
  do.call(tabItems, items)
})

header <- dashboardHeader()

ui <- dashboardPage(header, sidebar, body)

server <- function(input, output) {}

shinyApp(ui, server)

With renderUI the items are rendered only after switching the tabs - because the boxes are not existing when the dashboardBody is first rendered:使用renderUI仅在切换选项卡后才会呈现项目 - 因为在首次呈现 dashboardBody 时框不存在:

library(shiny)
library(shinydashboard)

dat <- tibble::tibble(
  category = c("blue", "blue", "green", "green", "green"),
  box_name = c("Box A", "Box B", "Box C", "Box D", "Box E"),
  box_desc = c("Foo", "Bar", "Bar", "Foo", "Foo")
)

sidebar <- dashboardSidebar(sidebarMenu(
  menuItem("Blue", tabName = "blue", icon = icon("dashboard")),
  menuItem("Green", tabName = "green", icon = icon("th"))
))

body <- dashboardBody(uiOutput("renderReports"))
header <- dashboardHeader()

ui <- dashboardPage(header, sidebar, body)

server <- function(input, output) {
  output$renderReports <- renderUI({
    items <- lapply(unique(dat$category), function(name) {
      tabItem(tabName = name, fluidRow(
        lapply(which(dat$category %in% name), function(i) {
        box(
          dat$box_desc[i],
          title = dat$box_name[i],
          paste0("Something here about ", name),
          width = 12,
          solidHeader = TRUE,
          status = "primary"
        )
      }))
    )})
    do.call(tabItems, items)
  })
}

shinyApp(ui, server)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM