如何从文件输入加载开始使用Shinycssloaders?

问题描述 投票:0回答:1

我正在使用 Shiny 部署一个应用程序,我需要加载一个文件,因为我正在使用 fileInput 函数,尽管我不一定必须使用此函数,并且我想使用shinycssloaders 包中的函数,而正在加载文件。我的问题是,我想在选择文件后立即获得一个微调器,但此微调器在我选择文件后一段时间后开始显示,尤其是当文件很大时。

我的代码如下:

library(shiny)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      fileInput("data", label = "Select a file")),
    mainPanel(
      shinycssloaders::withSpinner(DT::DTOutput("table"), caption = "Loading...")
    )
  )
)

server <- function(input, output, session){
  options(shiny.maxRequestSize=300*1024^5)
  data <- reactive({
    validate(need(input$data, 'Please, select a file to start'))  
    shinycssloaders::showPageSpinner(caption = "Loading data...")
    datos <- vroom::vroom(input$data$datapath, delim = ",")
    shinycssloaders::hidePageSpinner()
    return(datos)
  })
  output$table <- DT::renderDT(
    dplyr::sample_n(data(), 100),
    filter = "top",
    options = list(pageLength = 10,
                   extensions = 'Responsive')
  )
}
  
shinyApp(ui, server)

欢迎任何解决方案,非常感谢。

r shiny shinyapps shiny-reactivity shinyjs
1个回答
0
投票

您可以使用 shinybusy 包执行以下操作。使用一些 JavaScript,在使用文件输入时发送一个 Shiny 事件(

change
事件)。然后在 Shiny 应用程序中,您可以使用 shinybusy 中的手动旋转器,当触发 Shiny 事件时触发它,并将其隐藏在电抗导体的末端。这是一个小演示(我会使用更大的旋转器)。

library(shiny)
library(DT)
library(shinybusy)
library(vroom)
options(shiny.maxRequestSize=300*1024^5)

js <- "
$(document).ready(function() {
  $('#data').on('change', function() {
    Shiny.setInputValue('upload', true, {priority: 'event'});
  });
});
"

ui <- fluidPage(
  tags$head(
    tags$script(HTML(js))
  ),
  
  use_busy_spinner(
    spin = "semipolar",
    color = "#112446",
    position = "full-page",
    margins = c(10, 10),
    height = "150px",
    width = "150px"
  ),
  
  sidebarLayout(
    sidebarPanel(
      fileInput("data", label = "Select a file")
    ),
    mainPanel(
      DTOutput("table")
    )
  )
)

server <- function(input, output, session){
  
  data <- reactive({
    validate(need(input$data, 'Please, select a file to start'))  
    datos <- vroom::vroom(input$data$datapath, delim = ",")
    hide_spinner()
    return(datos)
  })
  
  output$table <- renderDT(
    dplyr::sample_n(data(), 100),
    filter = "top",
    options = list(pageLength = 10)
  )
  
  observeEvent(input$upload, {
    show_spinner()
  })
  
}

shinyApp(ui, server)

© www.soinside.com 2019 - 2024. All rights reserved.