在我的应用中,我有output
取决于许多inputs
。每当inputs
之一被更改时shiny
刷新output
,这需要很长时间。当我想要更改多个input
时会出现问题,因为我必须等待X次以获得正确的output
。如果另一个reactive/output
被更改,有没有办法打破input
的刷新?
在这个简单的例子中:
output$distPlot
取决于input$bins
和input$col
。 inputs
中的每次更改都需要3秒才能刷新直方图,因此当我想要更改它们时,我必须等待6秒钟。如果进行了另一次input
更改,我想要做的是打破现有刷新。
UI
library(shiny)
shinyUI(fluidPage(
sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:",
min = 1,
max = 50,
value = 30),
selectInput("col","Color",
choices = c("green","red","blue"),selected = "green")
),
mainPanel(
plotOutput("distPlot")
)
)
))
服务器
library(shiny)
shinyServer(function(input, output) {
output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = input$col, border = 'white')
Sys.sleep(3)
})
})
P.S。在我的情况下submitButton
不是一个选项,我正在寻找重置/中断渲染的选项
答案 0 :(得分:3)
感谢HubertL,我找到了答案。我必须创建一个包含所有依赖inputs
的被动列表,然后在其上使用debounce
,这样plot
只会更改一次(如果更改inputs
的时间在这个例子中将小于3000毫升)。
服务器:
library(shiny)
library(dplyr)
shinyServer(function(input, output,session) {
inputs_change<-reactive({
list(input$bins,input$col)
}) %>% debounce(3000)
output$distPlot <- renderPlot({
x <- faithful[, 2]
bins <- seq(min(x), max(x), length.out = inputs_change()[[1]] + 1)
hist(x, breaks = bins, col = inputs_change()[[2]], border = 'white')
Sys.sleep(3)
})
})