В настоящее время я разрабатываю блестящее приложение для клиента с большим набором данных (1,5 ГБ CSV, который я сжал до 150 МБ RDS).У меня возникают проблемы каждый раз, когда пользователь меняет ввод, кажется, что самый медленный шаг, импорт данных выполняется с каждым изменением.Вот минимальный пример (приложение немного сложнее, но проблема та же).
UI.R (базовый пример из R studio, здесь нет ничего важного, только выбор ввода и ggplot):
library(shiny)
# Define UI for application that draws a histogram
shinyUI(fluidPage(
# Application title
titlePanel("Old Faithful Geyser Data"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
selectInput("select_z", "Z Value", selected = 387.5,c(seq(293.5,443.5,1)))
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot")
)
)
))
Server.R (оператор readRDS из функции сервера и простой фильтр dplyr)
library(shiny)
library(dplyr)
library(magrittr)
library(ggplot2)
data <- readRDS('./data.rds')
# Define server logic required to draw a histogram
shinyServer(function(input, output) {
output$distPlot <- renderPlot({
# generate bins based on input$bins from ui.R
filtered_data <- data %>% filter(Z == input$select_z)
# draw the histogram with the specified number of bins
ggplot(filtered_data)+
geom_histogram(aes(X))
})
})
Начальная загрузка занимает примерно 10 секунд (как обычно), но проблема заключается в том, чтокаждый раз, когда пользователь меняет входные данные.
Я тестировал ту же настройку в нереактивной среде, и время намного быстрее, показывая, что единственным ограничением является импорт данных, остальные операции занимают меньше чемсекунда.
system.time(readRDS('./data.rds'))
user system elapsed
3.121 0.396 3.524
> system.time(filtered_data <- data %>% filter(Z == 384.5))
user system elapsed
0.048 0.011 0.059
> system.time(ggplot(filtered_data)+geom_histogram(aes(X)))
user system elapsed
0.001 0.000 0.001
Я думаю, что проблема в том, что оператор импорта данных выполняется каждый раз, когда изменяется вход, но я не нашел способа предотвратить это.
Спасибо