R Блестящий индикатор прогресса приложения для загрузки данных

Shiny - это наш внутренний инструмент бизнес-аналитики. Для наших приложений Shiny мы загружаем данные перед запуском shinyServer:

load("afterProcessedData.RData")
# or dt = fread("afterProcessedData.csv")

shinyServer(function(input, output, session){ ...

Однако некоторые приложения загружают большие файлы, и для их загрузки требуется до 30 секунд. Многие пользователи, открывая страницу, не знают, сломана ли страница, поскольку она зависает при загрузке. Они могут закрыть его или щелкнуть фильтры, что может вызвать ошибку. В этом случае будет очень полезен индикатор выполнения. Я заметил, что withProgress() может помочь, но это должно быть внутри reactive() или renderXx().

Один из способов, которым я могу это сделать, - это сделать laod() деформированным reactive() внутри shinyServer(function(input, output, session){, но меня беспокоит, что это снизит производительность. И мои пользователи очень заботятся о быстродействии.

Есть предложения по этой ситуации?

Изменить: я думаю, это не простой способ сделать это. У меня есть другая мысль. Может быть, я могу показать на экране текст «данные загружаются», но я должен заставить его исчезнуть после того, как появится первая таблица. Однако я не знаю, как настроить условие. Ниже мой код, показывающий первую таблицу:

dashboardBody(
fluidRow( 
  tabBox(width = 12,
         tabPanel("Summary",
                  dataTableOutput("data1")),

Заранее спасибо!


person Z. Zhang    schedule 09.02.2016    source источник
comment
Любопытно, почему withProgress() внутри reactive () или render() проблемы? . Несмотря на то, что меня не устраивает та панель состояния, которую она отображает, но у меня она работает нормально, когда я добавляю withProgress во все свои render() функции.   -  person user5249203    schedule 10.02.2016
comment
Кроме того, как насчет обертывания ваших функций загрузки данных примерами, показанными в этих решениях SO , а затем render, что вышло на Shiny withProgress()?   -  person user5249203    schedule 10.02.2016
comment
У меня это работает. output$Ref_output <- DT::renderDataTable(withProgress( message = 'Processing the query', value = 5, expr = { DT::datatable(reference.table(), selection = 'multiple') С некоторыми изменениями в файле CSS индикатор выполнения стал толще и красного цвета, чем по умолчанию.   -  person user5249203    schedule 10.02.2016
comment
@ user5249203 спасибо за ответ. Меня беспокоит наличие load() в reactive(), так как это замедлит производительность, поскольку каждое изменение будет вызывать load(). Второе решение с SO solutions каким-то образом удлиняет load() в 3 раза, в чем обвинят клиенты.   -  person Z. Zhang    schedule 10.02.2016
comment
Если эта нагрузка находится в глобальной переменной, то почему она должна load на каждом сеансе? для всего остального вы можете и должны использовать withProgress() также нежелательные кнопки, пока люди ждут с shinyjs пакетом, чтобы они не нажимали ни на что, пока он не будет полностью загружен   -  person Pork Chop    schedule 10.02.2016


Ответы (2)


Несмотря на то, что мне все еще интересно узнать, как добавить панель процесса для load(), я реализовал альтернативное решение, которое на данный момент подходит. На странице есть текст «данные загружаются ...», который исчезнет после появления первой таблицы.

#server.R   firstData is a reactive function to get the data for 1st table
  output$firstTable = reactive({
return(is.null(firstData()))
})
#ui.R
      conditionalPanel(
    condition = "output.firstTable",
    box(width = 12,
           h1("The data is loading...")
        )
  )
person Z. Zhang    schedule 09.02.2016
comment
Новые аспекты. Вместо того, чтобы загружать полный .rdata, вы можете сохранить каждый объект и читать их отдельно. Это эффективно и быстрее. Отметьте readRDS. Теперь есть простой способ получить спиннер или что-то подобное в Rshiny. DT::dataTableOutput(outputId = 'table')%>% withSpinner() - person user5249203; 05.10.2017

Чтобы сослаться на интригующее примечание от @ user5249203, withSpinner() выглядит полезным вариантом для этой функции и является частью shinycssloaders пакет. Я сам не использовал, но это определенно интригующий пакет, который оказался на CRAN и содержит несколько хороших примеров: https://andrewsali.shinyapps.io/example/

person cole    schedule 21.11.2017