调整闪亮进度条的大小并使其居中

时间:2017-05-18 09:13:20

标签: css r modal-dialog shiny progress-bar

我正在使用Shiny应用程序,我需要计算进程,并且在执行计算进度时,我使用progressBar来显示进程。

问题是进度条太小了,我不喜欢显示方式。

所以,我认为可能有一种方法可以使用Shiny模式实现进度条(这里有一个名为modalDialog的函数)。

我的想法是,当用户运行计算时,将打开一个显示progressBar的模态。

这是进度代码:

withProgress(message = 'Runing GSVA', value = 0, {
    incProgress(1, detail = "This may take a while...")
    functionToGenerate()
  })

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

我建议自定义通知的CSS类: 如果您检查通知程序的元素,则会看到它具有“shiny-notification”类。因此,您可以使用yourString += '<a onclick="doWhatever()">Show more</a>覆盖该类的某些属性。在下面的示例中(对于模板:请参阅tags$style()),我决定调整高度+宽度使其更大,顶部+左侧居中。

?withProgress

答案 1 :(得分:3)

您好我在程序包shinyWidgets中编写了一个进度条功能,您可以将其置于模态中,但与shiny::showModal一起使用很棘手,因此您可以创建自己的模态手动如下。它的代码要写得多,但效果很好。

library("shiny")
library("shinyWidgets")

ui <- fluidPage(
  actionButton(inputId = "go", label = "Launch long calculation"), #, onclick = "$('#my-modal').modal().focus();"

  # You can open the modal server-side, you have to put this in the ui :
  tags$script("Shiny.addCustomMessageHandler('launch-modal', function(d) {$('#' + d).modal().focus();})"),
  tags$script("Shiny.addCustomMessageHandler('remove-modal', function(d) {$('#' + d).modal('hide');})"),

  # Code for creating a modal
  tags$div(
    id = "my-modal",
    class="modal fade", tabindex="-1", `data-backdrop`="static", `data-keyboard`="false",
    tags$div(
      class="modal-dialog",
      tags$div(
        class = "modal-content",
        tags$div(class="modal-header", tags$h4(class="modal-title", "Calculation in progress")),
        tags$div(
          class="modal-body",
          shinyWidgets::progressBar(id = "pb", value = 0, display_pct = TRUE)
        ),
        tags$div(class="modal-footer", tags$button(type="button", class="btn btn-default", `data-dismiss`="modal", "Dismiss"))
      )
    )
  )
)

server <- function(input, output, session) {

  value <- reactiveVal(0)

  observeEvent(input$go, {
    shinyWidgets::updateProgressBar(session = session, id = "pb", value = 0) # reinitialize to 0 if you run the calculation several times
    session$sendCustomMessage(type = 'launch-modal', "my-modal") # launch the modal
    # run calculation
    for (i in 1:10) {
      Sys.sleep(0.5)
      newValue <- value() + 1
      value(newValue)
      shinyWidgets::updateProgressBar(session = session, id = "pb", value = 100/10*i)
    }
    Sys.sleep(0.5)
    # session$sendCustomMessage(type = 'remove-modal', "my-modal") # hide the modal programmatically
  })

}

shinyApp(ui = ui, server = server)