有没有一种方法可以防止在切换选项卡时发亮地“记住”旧图像?

时间:2020-07-28 13:56:33

标签: r shiny

我有一个闪亮的应用程序,其中有一堆选项卡,每个选项卡上都有一些绘图。还有一个带有一些控件的边栏,当我更改输入时,绘图可能需要几秒钟才能刷新。绝对可以(需要从数据库中加载数据)。

不好的是,当我离开选项卡然后稍后返回时,头几秒钟我看到了旧版本的绘图,这可能会非常混乱,尤其是在延迟达到3的情况下5秒(这种情况很少发生,但我找不到完全阻止它发生的方法)。

任何建议将不胜感激。

如果在描述中不清楚,请在下面提供一些希望有助于说明问题的代码。切换选项卡,向任一端移动滑块以更改图形,然后返回到原始选项卡-您应该能够看到图像从旧版本切换到新版本,这是我要摆脱的行为

library(shiny)

ui <- fluidPage(
   
   titlePanel("Old Faithful Geyser Data"),
   
   sidebarLayout(
      sidebarPanel(
         sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 5000,
                     value = 3000)
      ),
      
      mainPanel(
        tabsetPanel(
          tabPanel("tab1",
                   plotOutput("distPlot1")
          ),
          tabPanel("tab2",
                   plotOutput("distPlot2")
          )
        )
      )
   )
)

server <- function(input, output) {
   
  output$distPlot1 <- renderPlot({
    x    <- rnorm(input$bins) 
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
    plot(1:input$bins, x)
  })
  
  output$distPlot2 <- renderPlot({
    x    <- rnorm(input$bins)
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
    plot(1:input$bins, x)
  })
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

这是一个主意。 tabsetPanel具有id属性。如果设置,它将定义input中元素的名称,该元素包含value中所选标签的title / tabsetPanel。您可以测试一下是否在每个renderPlot中都选择了“正确”标签,如果未选择正确的标签,则返回NULL。我通过将Sys.sleep(1)放在MWE的每个renderPlot中来模拟您的数据库延迟,这似乎具有预期的效果。

library(shiny)

ui <- fluidPage(
  titlePanel("Old Faithful Geyser Data"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 5000,
                  value = 3000)
    ),
    mainPanel(
      tabsetPanel(
        id="panels",
        tabPanel("tab1",
                 plotOutput("distPlot1")
        ),
        tabPanel("tab2",
                 plotOutput("distPlot2")
        )
      )
    )
  )
)

server <- function(input, output) {
  output$distPlot1 <- renderPlot({
    if (input$panels != "tab1") return()
    Sys.sleep(1)
    x    <- rnorm(input$bins) 
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
    plot(1:input$bins, x)
  })
  output$distPlot2 <- renderPlot({
    if (input$panels != "tab2") return()
    Sys.sleep(1)
    x    <- rnorm(input$bins)
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    plot(1:input$bins, x)
  })
}

shinyApp(ui = ui, server = server)