отправленный Джо Ченгом. Это может помочь кому-то.
приведен пример кода, который принимает два ввода: 1) входной файл и 2) ввод числа строк. После нажатия кнопки «Анализ» выходные данные команды сервера возвращаются в «Таблицу» на вкладке «Результаты». Это простой пример, когда команда будет выполнена быстро и переключится на панель вкладок «Результаты».
НижеприведенноеwithProgress
Код показывает только индикатор выполнения в течение установленного времени и исчезает, а затем выполняется фактический код. Я хотел бы показать «Сообщение о состоянии» или «Индикатор выполнения» при нажатии «Анализ» и показать, пока команда выполняется. Пока текущий индикатор выполнения запущен, текущий пользователь (другие пользователи могут использовать приложение) не может выполнять какие-либо действия из боковой панели. Потому что в реальном приложении боковая панель имеет больше элементов меню, которые выполняют подобные задачи, и каждая задача имеетAnalyze
кнопка. Если пользователю разрешено просматривать страницы боковой панели и нажиматьAnalyze
тогда приложение будет перегружено выполнением нескольких задач. В идеале функциональность индикатора выполнения следует использовать с несколькими кнопками actionButton.
Я читаю блоги оasync
но не в состоянии поставить правильный код в нужном месте. любая помощь ценится за вознаграждение !!
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)