Вывод блестящего текста для обновления в конце запроса SQL - PullRequest
0 голосов
/ 02 мая 2019

У меня есть проблема, которая обсуждалась здесь по-разному, но, видимо, не для удовлетворения моих довольно простых потребностей.

У меня есть простое приложение, которое выполняет вызов базы данных SQL.Я использую кнопку для запуска запроса.Мне просто нужно текст с надписью "нажмите на кнопку", чтобы загрузить в самом начале.Как только пользователь нажмет на кнопку, мне понадобится этот текст для вывода: «Загрузка данных, пожалуйста, подождите».

Как только запрос будет завершен и данные будут полностью получены, мне потребуется выходной текстчтобы показать «Данные успешно загружены».

Я видел некоторые решения , основанные на индикаторе выполнения, но я не могу использовать его, так как я не прохожу через data.frame.Я запрашиваю базу данных и не знаю, сколько времени это может занять.Я видел других решений , основанных на реактивных значениях, но вывод текста в этом случае должен реагировать на размер кадра данных (0 строк и нажатие кнопки -> загрузка данных по-прежнему;> 0 строк и кнопка)нажал "данные успешно загружены").

Следовательно, я застрял здесь.Это мой простой код, но в идеале он делает то, что мне нужно.

ui <- fluidPage(
  fluidRow(actionButton("download_btn", "Download Data")),
  fluidRow(textOutput(outputId = "load_data_status")),
  fluidRow(dataTableOutput("output_table"))
)

server <- function(input, output) {
  cat("\n output$output_table = \n", output$output_table)

  data <- eventReactive(input$download_btn,{
    output$load_data_status <- renderText({ "Downloading data from Server. Please wait..." })
    # here I actually download the data from a database and this could take several seconds
    df <- data.frame(mtcars)
    output$load_data_status <- renderText({ "Data downloaded succesfully." })
    df
  })

  output$output_table <- renderDataTable({
    data()
  })

}
shinyApp(ui, server)

1 Ответ

1 голос
/ 03 мая 2019

Вариант A:

Вот довольно хорошее решение Дина Аттали: https://github.com/daattali/advanced-shiny/tree/master/busy-indicator

Вариант B:

Вы можете слушать JavaScript events to:

  1. Изменить текст при нажатии кнопки
  2. Изменить текст снова при визуализации вывода

Я также добавил Sys.sleep()для имитации некоторого времени загрузки.

Код:

library(shiny)

ui <- fluidPage(
  tags$head(tags$script(HTML('
    // 1. Change text to "Downloading..." when button is clicked
    $(document).on("shiny:inputchanged", function(event) {
      if (event.name === "download_btn") {
        $("#download_btn").html("Downloading data from Server. Please wait...");
      }
    });

    //. 2. Change text to "Success" when output table is changed
    $(document).on("shiny:value", function(event) {
      if (event.name === "output_table") {
        $("#download_btn").html("Data downloaded succesfully.");
      }
    });        
  '))),
  fluidRow(actionButton("download_btn", "Download Data")),
  fluidRow(DT::dataTableOutput("output_table"))
)

server <- function(input, output) {

  data <- eventReactive(input$download_btn,{
    df <- data.frame(mtcars)
    Sys.sleep(3) # Simulate some loading time

    df
  })

  output$output_table <- renderDataTable({
    data()
  })

}

shinyApp(ui, server)

Выход:

output

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