блестящий: применить блестящий погрузчик после нажатия кнопки действия - PullRequest
0 голосов
/ 29 мая 2018

BACKGROUND

У меня есть приложение, в котором пользователь выбирает имя файла в раскрывающемся меню (selectizeInput) и подтверждает выбор нажатием actionButton.Приложение отобразит результаты в формате DT::dataTableOutput.

OBJECTIVE

Я бы хотел показать экран загрузки (используя пакет shinydashboardloader), но только ПОСЛЕ того, как пользователь нажимает actionButton.До этого я хотел бы показать пустой экран.Кроме того, если пользователь хочет попробовать несколько файлов за один сеанс, экран загрузки должен появляться каждый раз при нажатии actionButton и исчезать при загрузке набора данных.

CURRENT STATE

В настоящее время, если я запускаю это приложение, кнопка загрузки появляется все время, даже до того, как пользователь выбирает файл

### ui.R
library(shiny)
library(shinydashboard)
library(DT)
library(shinycustomloader)

dashboardPage(
  dashboardHeader(),
  dashboardSidebar(

selectizeInput("file", "Select File",
               c("fileA", "fileB")), 

actionButton("submit", "Submit")
  ),
  dashboardBody(
    fluidRow(
      box(h2("My Data"),
      div(style = 'overflow-x: scroll', 
          withLoader(DT::dataTableOutput('mytable'),
                     type = "html",
                     loader = "loader1")),
      width = 12)

  )
  )
)


#### server.R
library(shiny)
library(shinydashboard)
library(DT)


shinyServer(function(input, output, session) {  

  file_name <- reactive({ 
req(input$file)
  })


  # When the Submit button is clicked, start the cleaning and matching 
  observeEvent(input$submit, {

## open chosen file 
#    open_file <- read_excel(paste0("input_files/", file_name()))

### + some processing that gives me matched_df

matched_df <- data.frame(A = c(1, 2, 3, 4),
                         B = c("A", "B", "C", "D"))

selected <- reactive({

  matched_df # + apply some filter

}) 



output$mytable = DT::renderDataTable({
  selected()
})


  })

})

Я предполагаючто путь вперед будет использовать conditionalPanel, но я не уверен, как сделать щелчок на actionButton условии.

ОБНОВЛЕНИЕ

Я применил conditionalPanel кdatatable, но он работает только при первом нажатии кнопки «Отправить».Если в том же сеансе я изменю имя файла и снова нажму кнопку, загрузчик не появится.Любые идеи, как я могу заставить его работать несколько раз за один сеанс?

  dashboardBody(
     fluidRow(
      box(h2("My Data"),
          conditionalPanel("input.submit==1",
          div(style = 'overflow-x: scroll', 
              withLoader(DT::dataTableOutput('mytable'),
                     type = "html",
                     loader = "loader1"))
      ),
      width = 12)

Любая помощь будет отличной, спасибо!

1 Ответ

0 голосов
/ 29 мая 2018

1: я не знаком с shinydashboardloader, но мне удалось добавить индикатор загрузки в мое приложение с помощью пакета shinyjs, чтобы скрывать и отображать элементы с помощью CSS.Я бы добавил элементы вашей страницы загрузки на главную страницу и обернул их в функцию shinyjs::hidden, чтобы они по умолчанию были скрыты.Затем, когда пользователь нажимает кнопку действия, вызовите shinyjs::showElement, чтобы показать их, и shinyjs::hideElement, чтобы скрыть их после завершения загрузки.

UI:

shinyjs::hidden(div(id = 'loading',
           # PUT LOADING ELEMENTS HERE))

СЕРВЕР:

observeEvent(input$submit, {
    # Show element once submit button is pressed
    shinyjs::showElement(id = 'loading')

    # CODE TO MAKE DATA FRAME

    # Hide loading element when done
    shinyjs::hideElement(id = 'loading')
)

2: Что касается вашей проблемы с редактированием, то причина того, что ваша условная панель отображается только в первый раз, заключается в том, что значение actionButton увеличивается на единицу при каждом нажатии.Таким образом, при первом нажатии происходит переход от 0 к 1;если вы щелкнете по нему еще раз, он перейдет с 1 на 2 и так далееПоскольку вы устанавливаете условие на input$select == 1, оно появится, только если кнопка была нажата ровно 1 раз.

Чтобы заставить ее делать то, что вы хотите, вам нужно либо изменить условие на input$select > 1чтобы он отображался до тех пор, пока кнопка была нажата один раз, или добавьте reactiveValue, который устанавливается в 1 при нажатии кнопки, а затем сбрасывается в 0 при выполнении другого условия (например, при завершении загрузки).

rv <- reactiveValues(loading = 0)

# When you click submit, show the loading screen
observeEvent(input$submit, {rv$loading <- 1})

# When you click LOAD, start loading, then hide the loading screen when finished
observeEvent(input$LOAD, {

    # CODE TO LOAD AND GENERATE DATA HERE

    rv$loading <- 0})
...