Блестящие выходные элементы не отображаются в bs4Da sh с вложенными модулями - PullRequest
1 голос
/ 15 января 2020

РЕДАКТИРОВАТЬ: Автор пакета bs4Dash, Дэвид Грэнджон, недавно предоставил ответ на вопрос, заданный в проблеме Github, упомянутой ниже, и закрыл ее.

  1. Мой вопрос, скорее всего, связан на этот вопрос в bs4Dash github repo , но ответа там не было.
  2. Полные воспроизводимые коды приведены в конце вопроса

My цель

Я делаю модульное приложение Shiny и пытаюсь сделать это с помощью пакета bs4Dash. Вот как выглядит приложение:

Изображение 1

The app

Конечное приложение имеет несколько разделов ( Я только сделал Введение для этого примера), и каждый раздел содержит по крайней мере один bs4TabCard. Карта вкладок на рисунке выше имеет один элемент uiOutput и один элемент rhandsontableOutput, которые отображаются в функции сервера. Обратите внимание, что оба элемента ***Output. В воспроизводимом коде для Рисунок 1 (который вы можете найти в конце вопроса) я не использую какой-либо модуль. Однако моя цель - использовать несколько модулей, потому что приложение может стать довольно большим. В этом простом примере я пытаюсь использовать два модуля: один модуль для каждого раздела (т.е. каждый bs4TabItem) и один модуль для каждой вкладки. Это означает, что два модуля всегда будут вложенными: модуль табуляции будет внутри модуля сечения.

Изображение 2

Show modules in the app

Проблема

Проблема заключается в том, что при реализации модулей элементы ***Output не отображаются:

Изображение 3

Modularized app with issue

Удивительно, что отображаются элементы ***Input. Я сделал третий модуль, содержащий только numericInput, и поместил его во вторую вкладку вкладки. На рисунке ниже показано, что numericInput отображается без проблем:

Изображение 4

Modularized app works with input elements

Я сделал домашнее задание

. В этом выпуске сообщается о подобной проблеме, но не было предложено никакого решения, и мое копание оказалось неудачным. Кажется, что есть проблема, когда выходной элемент помещается глубоко внутри нескольких вложенных контейнеров в 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")
  }
)

1 Ответ

3 голосов
/ 16 января 2020

вам не хватает пространства имен в модуле mod_section_ui. Должно быть:

mod_section_ui <- function(id){
  ns <- NS(id)
  mod_tabcard_ui(id = ns("tabcard"))
}
...