【发布时间】:2026-02-24 20:45:01
【问题描述】:
试图解决这个问题 R Shiny: display elapsed time while function is running, 我尝试了几件事,但我对模态对话框有疑问。
这是一个 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 分钟要好。有没有办法调整单位? (我做的真正代码在几分钟内运行,可能是几个小时)。
【问题讨论】:
标签: shiny modal-dialog difftime