Async: exibe o progresso quando o actionButton é atingido e desativa outras operações para o mesmo usuário, mas permite que usuários simultâneos

Below é um código de exemplo que recebe duas entradas: 1) arquivo de entrada e 2) número de linhas de entrada. Ao clicar no botão "Analisar", a saída do comando do servidor retorna para a "Tabela" no conjunto de guias "Resultados". Este é um exemplo simples em que o comando será executado rapidamente e alterna para o painel de controle "Resultados".

O abaixowithProgress código @ mostra apenas a barra de progresso durante o tempo definido e desaparece e, em seguida, o código real é executado. Eu gostaria de mostrar uma "Mensagem de status" ou "Barra de progresso" quando a "Análise" for atingida e mostrada enquanto o comando for executado. Enquanto a barra de progresso estiver em execução, o usuário atual (outros usuários podem usar o aplicativo) não poderá executar nenhuma ação na barra lateral. Como no aplicativo real, a barra lateral tem mais itens de menu que executam tarefas semelhantes como essa e cada tarefa possui umAnalyze botão. Se o usuário tiver permissão para navegar pelas páginas da barra lateral e pressionarAnalyze, o aplicativo terá uma sobrecarga de execução de várias tarefas. Idealmente, a funcionalidade da barra de progresso deve ser usada com vários actionButtons.

Li os blogs sobreasync mas incapaz de colocar o código certo no lugar certo. qualquer ajuda é apreciada com uma 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)

questionAnswers(3)

yourAnswerToTheQuestion