r - 有没有办法防止切换选项卡时旧图像 "remembering" Shiny ?

标签 r shiny

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

不太好的地方是,当我从某个选项卡切换然后再返回该选项卡时,前几秒钟我会看到旧版本的绘图,这可能会非常令人困惑,尤其是在延迟达到 3- 的情况下5秒(不常发生,但我找不到完全阻止它发生的方法)。

如有任何建议,我们将不胜感激。

下面请一些代码,如果描述不清楚的话,希望可以帮助说明问题。切换选项卡,将 slider 向任一端移动以更改图表,然后返回到原始选项卡 - 您应该能够看到图像从旧版本切换到新版本,这是我想要摆脱的行为.

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)

最佳答案

这是一个想法。 tabsetPanel 有一个 id 属性。如果设置,它定义 input 中元素的名称,该元素包含 tabsetPanel< 中所选选项卡的 value/title/。您可以测试它,看看是否在每个 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)

关于r - 有没有办法防止切换选项卡时旧图像 "remembering" Shiny ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63135824/

相关文章:

r - 在knitr中指定多个同时输出格式(新)

c - C 函数中的无符号整型

r - 使 R Shiny 的 renderPlot 对文本输入使用react

r - 鼠标悬停在 plotly 和 Shiny

r - 通过 R Shiny 进行逻辑回归

r - 尾声 gelman.diag() : "Error in chol.default(W) : the leading minor of order nn is not positive definite"

r - 将购物 list 分为多列

正则表达式提取与 R 中某些单词匹配的部分字符串

r - 无法看到使用 Docker 和 {golem} 构建的暴露的 Shiny 应用程序

r - DT::datatable 的条纹