Как автоматически перейти на другую боковую панель после загрузки данных на боковую панель в Shinydashboard? - PullRequest
1 голос
/ 21 февраля 2020

Здравствуйте, блестящие эксперты по приборной панели,

После репрезентационных работ. т.е. как только файл загружен в боковую панель: mod1, мы можем перейти к боковой панели: mod2 и увидеть отображенные загруженные данные.

Ниже приведен код: 1. Модуль для отображения с пользовательским интерфейсом 2. Модуль для чтения данных с его сервером пользовательского интерфейса и пользовательским интерфейсом для вызова модулей.

Можем ли мы автоматизировать это?

т. е. после загрузки данных на боковой панели: mod1,

боковая панель: мод2 должен видеть пользователь с загруженными данными.


library(shiny)
library(tidyverse)

# Module UI to read content
mod_readUI <- function(id) {
  ns <- shiny::NS(id)
  shiny::tagList(
    fileInput(ns("file1"), 
              h3("Choose xlsx file"),
              accept=c(".xlsx")),
    actionButton(ns("ref"), "Refresh")
  )
}

# Server modules of reading content
mod_read <- function(input, output, session){
  # Uploaded data as reactive element
  getData <- reactive({
    req(input$file1) # Ensure file is uploaded
    if(!is.null(input$file1)){
      my_data <- readxl::read_excel(input$file1$datapath)
      my_data
    }
    else{
      my_data <- "nothing" %>% as.data.frame()
      my_data
    }
  })

  ### In order to pass data as reactive elements to other module:
  # Created list
  reactive({
    # browser()
    list("excl" = getData())
  })
}

# Module UI to display content
mod_displayUI <- function(id) {
  ns <- shiny::NS(id)
  shiny::tagList(
    DT::dataTableOutput(ns("contents"))
  )
}

# Server functions
mod_display <- function(input, output, session, file) {
  output$contents <- DT::renderDataTable({
    req(file())
    DT::datatable(file()$excl,
                  options = list(pageLength = 7,scrollX = TRUE))
  })
}


ui <- 
  shinydashboard::dashboardPage(
    shinydashboard::dashboardHeader(),
    shinydashboard::dashboardSidebar(
      shinydashboard::sidebarMenu(id = "menu1",
                                  shinydashboard::menuItem('mod1',
                                                           tabName = 'mod1', 
                                                           icon = shiny::icon('file')),

                                  shinydashboard::menuItem('mod2',
                                                           tabName = 'mod2', 
                                                           icon = shiny::icon('file'))
      )),
    shinydashboard::dashboardBody(
      shinydashboard::tabItems(
        shinydashboard::tabItem("mod1",
                                mod_readUI("sidemod1")),
        shinydashboard::tabItem("mod2",
                                mod_displayUI("bodymod2")
        )
      )))

server <- function(input, output) {
  # storing mod_read in a variable
  readFile1 <- shiny::callModule(mod_read, "sidemod1")
  # passing the output of readFile into mod_display module
  displayFile <- shiny::callModule(mod_display, "bodymod2", file = readFile1)
}

shinyApp(ui,server)

1 Ответ

1 голос
/ 23 февраля 2020

Полагаю, вы можете добавить observe, чтобы увидеть, когда sidemod1-file1 input не NULL или не изменяется. Когда это произойдет, вы можете использовать updateTabItems. Обратите внимание, что в качестве аргумента server также необходимо указать session.

server <- function(input, output, session) {
  # storing mod_read in a variable
  readFile1 <- shiny::callModule(mod_read, "sidemod1")
  # passing the output of readFile into mod_display module
  displayFile <- shiny::callModule(mod_display, "bodymod2", file = readFile1)

  observe({
    req(input$`sidemod1-file1`)
    updateTabItems(session, "menu1", "mod2")
  })
}
...