闪亮:当另一个输入改变时,重新启动/中断输出的渲染

时间:2017-02-23 13:13:00

标签: r shiny

在我的应用中,我有output取决于许多inputs。每当inputs之一被更改时shiny刷新output,这需要很长时间。当我想要更改多个input时会出现问题,因为我必须等待X次以获得正确的output。如果另一个reactive/output被更改,有没有办法打破input的刷新?

在这个简单的例子中:

output$distPlot取决于input$binsinput$colinputs中的每次更改都需要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不是一个选项,我正在寻找重置/中断渲染的选项

1 个答案:

答案 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)
  }) 

})