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

R 如何在依赖项可用时动态加载闪亮的输出?,r,shiny,R,Shiny,我有一个闪亮的应用程序,有一个输入对象,它是两个输出对象的依赖项 第一个输出对象直接获取输入值,第二个输出对象需要进一步计算输入对象值 我想在更改输入对象后立即加载第一个输出对象,并在进一步计算结束后加载第二个输出对象 问题在于,即使第一个输出对象的依赖项早于第二个输出对象的依赖项,但这两个对象都是同时加载的 这是我的可复制代码。我想在更改slider1后立即显示plot1,并使plot2的微调器保持打开状态,直到可用为止 library("ggplot2") library("shiny")

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

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

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

问题在于,即使第一个输出对象的依赖项早于第二个输出对象的依赖项,但这两个对象都是同时加载的

这是我的可复制代码。我想在更改
slider1
后立即显示
plot1
,并使
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)
库(“ggplot2”)
图书馆(“闪亮”)
图书馆(“shinycssloaders”)

ui根据我的评论,所有的
反应式
表达式都会一起处理,并在呈现之前等待所有依赖项,即使您降低了第二个表达式的速度。但是,您可以使用
debounce
功能延迟第二次反应,有关更多信息,请参阅此处:

下面的示例将向您展示如何使用它,我将等待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)
库(ggplot2)
图书馆(闪亮)
图书馆(shinycssloaders)
图书馆(magrittr)

ui所有反应都一起处理,并将在呈现之前等待所有依赖项,即使您减慢了第二个,谢谢。这是非常有用的。