В попытке решить этот вопрос R Shiny: отображение истекшего времени во время работы функции , я попробовал несколько вещей, и у меня есть вопросы по поводу модального диалога.
Вот MWE
library(shiny)
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
actionButton('run', 'Run')
),
mainPanel(
tableOutput("result")
)
)
)
server <- function(input, output) {
N <- 4
rv_time <- reactiveValues(
startTime = Sys.time(),
endTime = Sys.time()
)
output$start <- renderUI({
line1 <- paste("Start at:", format(Sys.time(), format = "%R"))
line2 <- "Be patient, it can takes some time"
HTML(paste(line1, line2, sep = "<br/>"))
})
result_val <- reactiveVal()
observeEvent(input$run,{
showModal(modalDialog(htmlOutput("start"), footer = NULL))
rv_time$startTime <- Sys.time()
result_val(NULL)
for(i in 1:N){
# Long Running Task
Sys.sleep(1)
}
result_val(quantile(rnorm(1000)))
rv_time$endTime <- Sys.time()
# removeModal()
showModal(modalDialog(textOutput("timer"), footer = modalButton("Cancel")))
})
output$result <- renderTable({
result_val()
})
output$timer <- renderText({
paste0("Executed in: ", round(difftime(rv_time$endTime, rv_time$startTime, units = "mins"),2), " minutes")
})
}
shinyApp(ui = ui, server = server)
Если вы нажмете кнопку «Выполнить» в первый раз, вы увидите, что первое диалоговое сообщение пустое, то будет работать время выполнения.
Если вы нажмите в другой раз, затем на кнопку «Выполнить», тогда все работает. Я не знаю, почему это происходит.
Я мог бы избежать вызова output$start
, и тогда у меня не было бы проблем. Но я хотел бы понять, почему это не работает, а также вместо отображения времени запуска я хочу отобразить «динамический» таймер.
После нажатия кнопки «Выполнить» в диалоговом окне отображается прошедшее время с начала цикла. Поэтому я подумал, что мне нужно использовать промежуточное значение output$start
(я пытался включить invalideLater
, но пока не получилось). Хотя я могу ошибаться.
Не связано с этим, у меня вопрос по поводу difftime
. Мне пришлось использовать опцию unit = "mins"
, чтобы я мог добавить модуль позади, потому что в противном случае он не отображает модуль по умолчанию. Этот пример выполняется за 4 секунды, будет лучше, чем печатать 4 секунды вместо 0,07 минуты. Есть ли способ адаптировать устройство? (Реальный код, который я сделал, запускается за несколько минут, а может и часов).