我有一个 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/