Блестящий динамический модальныйДиалог рендеринга * difftime - PullRequest
0 голосов
/ 29 апреля 2020

В попытке решить этот вопрос 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 минуты. Есть ли способ адаптировать устройство? (Реальный код, который я сделал, запускается за несколько минут, а может и часов).

1 Ответ

0 голосов
/ 30 апреля 2020

htmlOutput("start") не рассчитывается, когда оно скрыто. Если вы добавите строку

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

, то она будет отображаться при первом нажатии кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...