如何在依赖项可用时动态加载闪亮输出?

时间:2018-05-29 06:29:02

标签: r shiny

我有一个带有一个输入对象的闪亮应用程序,它是2个输出对象的依赖项。

第一个输出对象直接获取输入值,第二个输出对象需要进一步计算输入对象值。

我希望在更改输入对象后加载第一个输出对象,并在进一步计算结束后加载第二个输出对象。

问题是即使第一个输出对象的依赖项早于第二个输出对象的依赖项,也会同时加载这些对象。

这是我可重现的代码。我希望在更改plot1后立即显示slider1并在plot2上保留微调器,直到它可用为止。

library("ggplot2")
library("shiny")
library("shinycssloaders")
ui <- fluidPage(
          sliderInput("slider1", label = "Slider 1", min = 0, max = 100, step = 1, value = c(0,100)),
          withSpinner(plotOutput("plot1")),
          withSpinner(plotOutput("plot2"))

)

server <- function(input, output, session) {
  output$plot1 <- renderPlot({
    ggplot() + geom_point(aes(
      x = runif(n = 100, min = 0, max = 100),
      y = runif(
        n = 100,
        min = input$slider1[1],
        max = input$slider1[2]
      )
    ))
  })

  plot2_min <- reactive({
    Sys.sleep(time = 2)
    input$slider1[1]
  })

  plot2_max <- reactive({
    Sys.sleep(time = 2)
    input$slider1[2]
  })

  output$plot2 <- renderPlot({
    ggplot() + geom_point(aes(
      x = runif(n = 100, min = 0, max = 100),
      y = runif(
        n = 100,
        min = plot2_min(),
        max = plot2_max()
      )
    ))
  })
}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:1)

根据我的评论所有reactive表达式一起处理,并在渲染之前等待所有依赖项,即使你减慢第二个表达式。但是,您可以使用debounce功能延迟第二个被动反应,有关详细信息,请参阅此处:https://shiny.rstudio.com/reference/shiny/1.0.2/debounce.html

以下示例将向您展示如何使用它,我等待2秒:

library(ggplot2)
library(shiny)
library(shinycssloaders)
library(magrittr)

ui <- fluidPage(
  sliderInput("slider1", label = "Slider 1", min = 0, max = 100, step = 1, value = c(0,100)),
  withSpinner(plotOutput("plot1")),
  withSpinner(plotOutput("plot2"))

)

server <- function(input, output, session) {

  data1 <- reactive({
    data.frame(x = runif(n = 100, min = 0, max = 100),
                        y = runif(n = 100,min = input$slider1[1],max = input$slider1[2]))

  })

  output$plot1 <- renderPlot({
    ggplot() + geom_point(aes(data1()$x,data1()$y))
  })

  plot2_min <- eventReactive(data1(),{
    input$slider1[1]
  })

  plot2_max <- eventReactive(data1(),{
    input$slider1[2]
  })

  data2 <- reactive({
    data.frame(x = runif(n = 100, min = 0, max = 100),
               y = runif(n = 100,min = plot2_min(),max = plot2_max()))
  }) %>% debounce(2000)

  output$plot2 <- renderPlot({
    ggplot() + geom_point(aes(data2()$x,data2()$y))
  })

}

shinyApp(ui, server)

enter image description here