发光的动态modalDialog渲染* difftime

问题描述 投票:0回答:1

为了解决这个问题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
1个回答
0
投票

htmlOutput("start")隐藏时不计算。如果添加行

outputOptions(output, "start", suspendWhenHidden = FALSE)

然后它将在按钮的第一次点击时显示。

© www.soinside.com 2019 - 2024. All rights reserved.