我有一个带有一个输入对象的闪亮应用程序,它是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)
答案 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)