我正在使用 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)
欢迎任何解决方案,非常感谢。
您可以使用 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)