【发布时间】:2022-01-23 20:18:38
【问题描述】:
我正在编写过滤器并在每次应用新过滤器时汇总数据的应用程序。因为其中一个过滤器是具有相当大基数(> 10,000)的搜索框,并且由于源数据中的总行数很大,并且已经部分汇总,所以它可能需要一段时间才能更新。 我希望有一个缓冲期,应用程序等待用户输入结束,例如,在实际开始更新过程之前 1-2 秒。
这是一个简单的示例(没有高基数),如果您以相对较快的速度连续切换不同的选项,您将看到几个中间图。如果增加N,效果会更强、更明显(也更烦人)。这里的瓶颈很可能是图形生成与数据处理,但总体概念是相同的。
library(shiny)
ui <- fluidPage(
titlePanel('Example Title'),
sidebarLayout(
sidebarPanel(
checkboxGroupInput(
'yFilterCheckbox',
label='Filter Checkbox',
choices = c('y<=-1','-1<y<1','y>=1'),
selected = c('y<=-1','-1<y<1','y>=1'),
),
checkboxGroupInput(
'cat1FilterCheckbox',
label='Category 1 Filter',
choices=LETTERS[1:4],
selected=LETTERS[1:4]
),
checkboxGroupInput(
'cat2FilterCheckbox',
label='Category 2 Filter',
choices=c('BIG','SMALL'),
selected = c('BIG','SMALL')
)
),
mainPanel(
plotOutput('myPlot')
)
)
)
server <- function(input, output){
library(tidyverse)
set.seed(2021*12*21)
N=200000
mydata = data.frame(
x1 = rnorm(N),
x2 = rnorm(N),
x3 = rnorm(N),
c1 = sample(LETTERS[1:4], N, replace=T),
c2 = sample(c('BIG','SMALL'), N, replace=T)
) %>%
mutate(
y1 = x1 * (1 + (c1 == 'D')) +
x2 * (1 - (c1 == 'C')) +
(x3 - rnorm(N)) * (1 + 3 * (c2 == 'BIG')),
z1 = 1 * (y1 > 0)
)
output$myPlot <- renderPlot({
ggplot(
mydata %>%
filter(
c1 %in% input$cat1FilterCheckbox &
c2 %in% input$cat2FilterCheckbox &
case_when(
y1 <= -1 ~ 'y<=-1' %in% input$yFilterCheckbox,
y1 > -1 & y1 < 1 ~ '-1<y<1' %in% input$yFilterCheckbox,
TRUE ~ 'y>=1' %in% input$yFilterCheckbox
)
)
) +
geom_point(
aes(x=x1,y=y1, color=c1, shape=c2)
) + theme_bw()
})
}
shinyApp(ui=ui, server=server)
【问题讨论】:
标签: r shiny user-input