【问题标题】:Is there a way to prevent shiny from "remembering" the old image when switching tabs?有没有办法在切换标签时防止闪亮“记住”旧图像?
【发布时间】:2020-11-17 23:51:50
【问题描述】:

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

不太好的情况是,当我从一个选项卡切换并稍后返回它时,前几秒钟我会看到旧版本的绘图,这可能非常令人困惑,尤其是在延迟达到 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)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 谢谢——这是一个很好的解决方案(我试图投票,但它对我不起作用——可能没有足够的积分或类似的东西)。不幸的是,在我的情况下使用它并不是很简单,因为在我的应用程序中,选项卡是通过降价实现的,而不是通过显式调用 tabsetPanel(它是一个 flexdashboard 应用程序)。我找不到如何访问 flexdashboard 中当前活动的页面——如果您碰巧有任何想法,我们将不胜感激。最好的问候,尼古拉
    • 我没有使用过 flesxdashboard 的经验,但我认为this question 的两个答案中的任何一个都可以适应您的需求。
    • 谢谢,看起来很有希望
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2021-12-03
    • 2018-07-03
    • 2019-02-15
    相关资源
    最近更新 更多