R Shiny: не показывать cssloader, пока не будет нажата кнопка действия - PullRequest
0 голосов
/ 04 июня 2018

Я хочу показать спиннер cssloader, пока выполняется некоторая обработка.Cssloader должен отображаться только после нажатия кнопки actionButton, которая запускает обработку данных (этот шаг требует некоторого времени, смоделированного функцией sys.Sleep() в приведенном ниже примере).Кроме того, я хочу, чтобы он отображался каждый раз, когда действие вызывается actionButton, а не только в первый раз.

Вот пример того, что я пытаюсь:

library(shiny)
library(shinycssloaders)

ui <- fluidPage(
   titlePanel("CSS loader test"),

   sidebarLayout(
      sidebarPanel(
         selectInput("imageOptions", "Choose an image:", choices = list(option1="RStudio-Logo-Blue-Gradient.png", option2="RStudio-Logo-All-Gray.png")),
         actionButton("getImage", "Show image:")
      ),

      mainPanel(
         withSpinner(uiOutput("logo"))
      )
   )
)

server <- function(input, output) {
  url<-reactive(
   paste0("https://www.rstudio.com/wp-content/uploads/2014/07/", input$imageOptions)
   )

  observeEvent(input$getImage,{
    output$logo<-renderText({
      URL<-isolate(url())
      print(URL)
      Sys.sleep(2)
      c('<center><img src="', URL, '"width="50%" height="50%" align="middle"></center>')
    })
  })

}
# Run the application 
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 05 июня 2018

Могу поспорить, есть лучшие способы выполнить то, что мне было нужно, но вот решение:

library(shiny)
library(shinycssloaders)

ui <- fluidPage(
  titlePanel("CSS loader test"),

  sidebarLayout(
    sidebarPanel(
      selectInput("imageOptions", "Choose an image:", choices = list(option1="RStudio-Logo-Blue-Gradient.png", option2="RStudio-Logo-All-Gray.png")),
      actionButton("getImage", "Show image:")
    ),

    mainPanel(
      withSpinner(uiOutput("logo"))
    )
  )
)

server <- function(input, output) {
  url<-reactive(
    paste0("https://www.rstudio.com/wp-content/uploads/2014/07/", input$imageOptions)
  )
  output$logo<-renderText({
    validate(need(input$getImage, "")) #I'm sending an empty string as message.
    input$getImage
      URL<-isolate(url())
      print(URL)
      Sys.sleep(2)
      c('<center><img src="', URL, '"width="50%" height="50%" align="middle"></center>')
  })
}
# Run the application 
shinyApp(ui = ui, server = server)

Вместо получения реактивности с вызовом на observeEvent рабочее решение - использовать вызовvalidate(need(input$getImage, "")) внутри функции render.

...