Async: muestra el progreso cuando actionButton es golpeado y deshabilita otras operaciones para el mismo usuario pero permite usuarios concurrentes

Below es un código de muestra que toma dos entradas: 1) archivo de entrada y 2) número de filas de entrada. Al hacer clic en el botón "Analizar", la salida del comando del servidor vuelve a la "Tabla" en el conjunto de pestañas "Resultados". Este es un ejemplo simple donde el comando se ejecutará rápidamente y cambia al panel de pestaña "Resultados".

El siguientewithProgress code solo muestra la barra de progreso durante el tiempo establecido y desaparece y luego se ejecuta el código real. Me gustaría mostrar un "Mensaje de estado" o una "Barra de progreso" cuando se presiona "Analizar" y mostrar mientras se ejecuta el comando. Mientras la barra de progreso se esté ejecutando, el usuario actual (otros usuarios pueden usar la aplicación) no puede realizar ninguna acción desde la barra lateral. Porque en la aplicación real, la barra lateral tiene más menuItems que realiza tareas similares como esta y cada tarea tiene unaAnalyze botón. Si el usuario puede navegar a las páginas de la barra lateral y presionarAnalyze entonces la aplicación tendrá una sobrecarga de realizar múltiples tareas. Idealmente, la funcionalidad de la barra de progreso deberíamos usarla con múltiples actionButtons.

Leí los blogs sobreasync pero no puede poner el código correcto en el lugar correcto. cualquier ayuda es apreciada con una recompensa !!

library(shiny)
library(shinydashboard)
sidebar <- dashboardSidebar(width = 200,
                    sidebarMenu(id = "tabs",
                                menuItem(
                                  "File", tabName = "tab1", icon = icon("fas fa-file")
                                )))
body <- tabItem(tabName = "tab1",
        h2("Input File"),
        fluidRow(
          tabPanel(
            "Upload file",
            value = "upload_file",
            fileInput(
              inputId = "uploadFile",
              label = "Upload Input file",
              multiple = FALSE,
              accept = c(".txt")
            ),
            checkboxInput('header', label = 'Header', TRUE)
          ),
          box(
            title = "Filter X rows",
            width = 7,
            status = "info",
            tabsetPanel(
              id = "input_tab",
              tabPanel(
                "Parameters",
                numericInput(
                  "nrows",
                  label = "Entire number of rows",
                  value = 5,
                  max = 10
                ),
                actionButton("run", "Analyze")
              ),
              tabPanel(
                "Results",
                value = "results",
                navbarPage(NULL,
                           tabPanel(
                             "Table", DT::dataTableOutput("res_table"), 
icon = icon("table")
                           )),
                downloadButton("downList", "Download")
              )
            )
          )
        ))
ui <-
shinyUI(dashboardPage(
dashboardHeader(title = "TestApp", titleWidth = 150),
sidebar,dashboardBody(tabItems(body))
))


server <- function(input, output, session) {
file_rows <- reactiveVal()

observeEvent(input$run, {
withProgress(session, min = 1, max = 15, {
  setProgress(message = 'Analysis in progress',
              detail = 'This may take a while...')
  for (i in 1:15) {
    setProgress(value = i)
    Sys.sleep(0.5)
  }
})
system(paste(
  "cat",
  input$uploadFile$datapath,
  "|",
  paste0("head -", input$nrows) ,
  ">",
  "out.txt"
),
intern = TRUE)
head_rows <- read.delim("out.txt")
file_rows(head_rows)
  })

observeEvent(file_rows(), {
updateTabsetPanel(session, "input_tab", "results")
output$res_table <-
DT::renderDataTable(DT::datatable(
file_rows(),
options = list(
  searching = TRUE,
  pageLength = 10,
  rownames(NULL),
  scrollX = T
  )
  ))
 })

output$downList <- downloadHandler(
filename = function() {
paste0("output", ".txt")
}, content = function(file) {
write.table(file_rows(), file, row.names = FALSE)
}
)
}

shinyApp(ui = ui, server = server)

Respuestas a la pregunta(3)

Su respuesta a la pregunta