[英]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.