有光泽的:按下actionButton后应用shinycustomerloader

时间:2018-05-29 12:09:29

标签: r shiny shinydashboard

背景

我有一个应用,用户从下拉菜单(selectizeInput)中选择文件名,并使用actionButton确认选择。该应用程序将以DT::dataTableOutput格式显示结果。

目的

我希望能够显示加载屏幕(使用shinydashboardloader包),但仅在用户按下actionButton后显示。在此之前,我想显示一个空屏幕。此外,如果用户想要在一个会话中尝试多个文件,则每次按下actionButton时都会显示加载屏幕,并在加载数据集时消失。

当前状态

目前,如果我运行此应用程序,加载按钮会一直出现,也是在用户选择文件之前

### 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应用于数据表,但仅在我第一次按“提交”按钮时才有效。如果在同一会话中我更改文件名并再次按下按钮,则不会显示加载程序。任何想法如何让我在一个会话中多次工作?

  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 :(得分:1)

1:我不熟悉TextBlock,但我可以使用shinydashboardloader包来隐藏和显示使用CSS的元素,从而为我的应用添加加载指示器。我会将您的加载页面元素添加到主页面并将它们包装在shinyjs函数中,以便它们默认隐藏。然后,当用户点击操作按钮时,请致电shinyjs::hidden以显示他们,并shinyjs::showElement在加载完成后隐藏它们。

用户界面:

shinyjs::hideElement

SERVER:

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

2:至于您的编辑问题,您的条件面板仅首次显示的原因是每次点击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') ) 的值增加1。所以第一次点击它就会从0变为1;如果你再次点击它,它会从1到2,依此类推。由于您将条件设置为actionButton,因此仅在按钮被单击一次时才会显示。

要让它按照您的意愿执行操作,您需要将条件更改为input$select == 1,以便只要单击按钮一次就会显示该条件,或添加设置为input$select > 1的条件单击按钮时为1,然后在满足另一个条件时重置为0(如加载完成时)。

reactiveValue