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)