РЕДАКТИРОВАТЬ: Автор пакета bs4Dash
, Дэвид Грэнджон, недавно предоставил ответ на вопрос, заданный в проблеме Github, упомянутой ниже, и закрыл ее.
- Мой вопрос, скорее всего, связан на этот вопрос в
bs4Dash
github repo , но ответа там не было. - Полные воспроизводимые коды приведены в конце вопроса
My цель
Я делаю модульное приложение Shiny и пытаюсь сделать это с помощью пакета bs4Dash
. Вот как выглядит приложение:
Изображение 1
Конечное приложение имеет несколько разделов ( Я только сделал Введение для этого примера), и каждый раздел содержит по крайней мере один bs4TabCard
. Карта вкладок на рисунке выше имеет один элемент uiOutput
и один элемент rhandsontableOutput
, которые отображаются в функции сервера. Обратите внимание, что оба элемента ***Output
. В воспроизводимом коде для Рисунок 1 (который вы можете найти в конце вопроса) я не использую какой-либо модуль. Однако моя цель - использовать несколько модулей, потому что приложение может стать довольно большим. В этом простом примере я пытаюсь использовать два модуля: один модуль для каждого раздела (т.е. каждый bs4TabItem
) и один модуль для каждой вкладки. Это означает, что два модуля всегда будут вложенными: модуль табуляции будет внутри модуля сечения.
Изображение 2
Проблема
Проблема заключается в том, что при реализации модулей элементы ***Output
не отображаются:
Изображение 3
Удивительно, что отображаются элементы ***Input
. Я сделал третий модуль, содержащий только numericInput
, и поместил его во вторую вкладку вкладки. На рисунке ниже показано, что numericInput
отображается без проблем:
Изображение 4
Я сделал домашнее задание
. В этом выпуске сообщается о подобной проблеме, но не было предложено никакого решения, и мое копание оказалось неудачным. Кажется, что есть проблема, когда выходной элемент помещается глубоко внутри нескольких вложенных контейнеров в bs4Dash
.
Воспроизводимый код
Воспроизводимый код для рисунка 1
library(shiny)
library(bs4Dash)
library(rhandsontable)
shiny::shinyApp(
ui = bs4DashPage(
old_school = FALSE,
sidebar_min = TRUE,
sidebar_collapsed = FALSE,
controlbar_collapsed = FALSE,
controlbar_overlay = TRUE,
title = "Basic Dashboard",
navbar = bs4DashNavbar(),
sidebar = bs4DashSidebar(
sidebarMenu(
bs4Dash::menuItem(
text = "Introduction",
tabName = "tab-introduction",
icon = ""
)
)
),
controlbar = bs4DashControlbar(),
footer = bs4DashFooter(),
body = bs4DashBody(
bs4TabItems(
bs4TabItem(
tabName = "tab-introduction",
bs4TabCard(
id = "tabcard", title = "Tab Card", side = "right",
bs4TabPanel(
tabName = "Tab 1",
uiOutput("ui"),
rHandsontableOutput("hot")
),
bs4TabPanel(
tabName = "Tab 2",
p("Hey")
)
)
)
)
)
),
server = function(input, output) {
output$hot <- renderRHandsontable({ rhandsontable(mtcars[1:10, 1:3]) })
output$ui <- renderUI({
numericInput("num_ui", label = "Num In", value = 15)
})
}
)
Воспроизводимый код для рисунка 3 и рисунка 4
library(shiny)
library(bs4Dash)
library(rhandsontable)
# Tabcard module ----------------------------------------------------------
mod_tabcard_ui <- function(id){
ns <- NS(id)
bs4TabCard(
id = ns("tabcard"), title = "Tab Card", side = "right",
bs4TabPanel(
tabName = "Tab 1",
uiOutput(ns("ui")),
rHandsontableOutput(ns("hot"))
),
bs4TabPanel(
tabName = "Tab 2",
mod_numinput_ui(ns("num"))
)
)
}
mod_tabcard_server <- function(input, output, session){
output$hot <- renderRHandsontable({ rhandsontable(mtcars[1:10, 1:3]) })
output$ui <- renderUI({
numericInput(session$ns("num_ui"), label = "Num In", value = 15)
})
callModule(mod_numinput_server, "num")
}
# Numeric input module ----------------------------------------------------
mod_numinput_ui <- function(id){
ns <- NS(id)
numericInput(ns("num"), "Num In", 0, 0, 10)
}
mod_numinput_server <- function(input, output, server){
return(reactive({input$num}))
}
# Section module ----------------------------------------------------------
mod_section_ui <- function(id){
ns <- NS(id)
mod_tabcard_ui(id = "tabcard")
}
mod_section_server <- function(input, output, session){
callModule(mod_tabcard_server, id = "tabcard")
}
# The app -----------------------------------------------------------------
shiny::shinyApp(
ui = bs4DashPage(
old_school = FALSE,
sidebar_min = TRUE,
sidebar_collapsed = FALSE,
controlbar_collapsed = FALSE,
controlbar_overlay = TRUE,
title = "Basic Dashboard",
navbar = bs4DashNavbar(),
sidebar = bs4DashSidebar(
sidebarMenu(
bs4Dash::menuItem(
text = "Introduction",
tabName = "tab-introduction",
icon = ""
)
)
),
controlbar = bs4DashControlbar(),
footer = bs4DashFooter(),
body = bs4DashBody(
bs4TabItems(
bs4TabItem(
tabName = "tab-introduction",
mod_section_ui(id = "mod")
)
)
)
),
server = function(input, output) {
callModule(mod_section_server, id = "mod")
}
)