首页 > 解决方案 > 有没有办法避免使用闪亮的重新计算绘制绘图之间的闪烁

问题描述

有没有办法避免使用闪亮的重新计算绘制图之间的闪烁?

绘图在失效时变为灰色机制(闪烁)(在我们的例子中,这意味着值 $a 已更改),因此它们当前的显示不是最新的,但它们还没有完成重新计算values$a 的新值。我们可以加速重新计算(通过并行化代码),但永远不能完全摆脱它。因此,删除此机制实际上会删除最终用户的信息,因为您现在无法知道绘图是否仍然是最新的,或者它是否正在重新计算下一个值......我知道这可能很烦人,但是我只是想确保你明白为什么会这样。

感谢您花时间阅读本文,如果您能提出一些解决方案,我们将很高兴。

library("shiny")
library("parallel")
library("pryr")
ui <-  basicPage(
  plotOutput('plot1')
  ,plotOutput('plot2')
  ,plotOutput('plot3')
  ,plotOutput('plot4')
  ,plotOutput('plot5')
  ,plotOutput('plot6')
  ,plotOutput('plot7')
  ,plotOutput('plot8')
  ,plotOutput('plot9')
  ,plotOutput('plot10')
  ,plotOutput('plot11')
  ,plotOutput('plot12')
  ,plotOutput('plot13')
  ,plotOutput('plot14')
  ,plotOutput('plot15')
  ,plotOutput('plot16')
  ,plotOutput('plot17')
  ,plotOutput('plot18')
  ,plotOutput('plot19')
  ,plotOutput('plot20')
  ,plotOutput('plot21')
  ,plotOutput('plot22')
  ,plotOutput('plot23')
  ,plotOutput('plot24')
  ,plotOutput('plot25')
  ,plotOutput('plot26')
  ,plotOutput('plot27')
  ,plotOutput('plot28')
  ,plotOutput('plot29')
  ,plotOutput('plot30')
)


server <- function(input, output) {
  
  values <- reactiveValues(a=1) 
  observe({
    invalidateLater(5000)
    
    doPlot<-rnorm(1)
    
    values$a <- doPlot
    print(mem_used())
  })
  
  observeEvent(values$a,{
    mclapply(1:30,function(i){
      output[[paste0("plot",i)]] <- renderPlot({plot(rnorm(50),main=i)})
    })  
  })
}

shinyApp(ui,server)


##################################

library("shiny")
library("parallel")
library("pryr")

ui <-  basicPage(
  plotOutput('plot1')
  ,plotOutput('plot2')
  ,plotOutput('plot3')
  ,plotOutput('plot4')
  ,plotOutput('plot5')
  ,plotOutput('plot6')
  ,plotOutput('plot7')
  ,plotOutput('plot8')
  ,plotOutput('plot9')
  ,plotOutput('plot10')
  ,plotOutput('plot11')
  ,plotOutput('plot12')
  ,plotOutput('plot13')
  ,plotOutput('plot14')
  ,plotOutput('plot15')
  ,plotOutput('plot16')
  ,plotOutput('plot17')
  ,plotOutput('plot18')
  ,plotOutput('plot19')
  ,plotOutput('plot20')
  ,plotOutput('plot21')
  ,plotOutput('plot22')
  ,plotOutput('plot23')
  ,plotOutput('plot24')
  ,plotOutput('plot25')
  ,plotOutput('plot26')
  ,plotOutput('plot27')
  ,plotOutput('plot28')
  ,plotOutput('plot29')
  ,plotOutput('plot30')
)


server <- function(input, output) {
  values <- reactiveValues(a=1) 
  
  observe({
    invalidateLater(5000)
    
    doPlot<-rnorm(1)
    
    values$a <- doPlot
    print(mem_used())
  })
  
  mclapply(1:30,function(i){
    output[[paste0("plot",i)]] <<- renderPlot({values$a
      plot(rnorm(50),main=i)
    })
  })
  
}
shinyApp(ui,server)

标签: rshiny

解决方案


您可以通过 css 更改重新计算的不透明度,例如将以下内容添加到您的 UI 代码中:

  tags$style(type="text/css",
             ".recalculating {opacity: 1.0;}"
  )

使用您的示例:

library("shiny")
library("parallel")
library("pryr")
ui <-  basicPage(
  tags$style(type="text/css",
             ".recalculating {opacity: 1.0;}"
  ),
  plotOutput('plot1')
  ,plotOutput('plot2')
  ,plotOutput('plot3')
  ,plotOutput('plot4')
  ,plotOutput('plot5')
  ,plotOutput('plot6')
  ,plotOutput('plot7')
  ,plotOutput('plot8')
  ,plotOutput('plot9')
  ,plotOutput('plot10')
  ,plotOutput('plot11')
  ,plotOutput('plot12')
  ,plotOutput('plot13')
  ,plotOutput('plot14')
  ,plotOutput('plot15')
  ,plotOutput('plot16')
  ,plotOutput('plot17')
  ,plotOutput('plot18')
  ,plotOutput('plot19')
  ,plotOutput('plot20')
  ,plotOutput('plot21')
  ,plotOutput('plot22')
  ,plotOutput('plot23')
  ,plotOutput('plot24')
  ,plotOutput('plot25')
  ,plotOutput('plot26')
  ,plotOutput('plot27')
  ,plotOutput('plot28')
  ,plotOutput('plot29')
  ,plotOutput('plot30')
)


server <- function(input, output) {
  
  values <- reactiveValues(a=1) 
  observe({
    invalidateLater(5000)
    
    doPlot<-rnorm(1)
    
    values$a <- doPlot
    print(mem_used())
  })
  
  observeEvent(values$a,{
    mclapply(1:30,function(i){
      output[[paste0("plot",i)]] <- renderPlot({plot(rnorm(50),main=i)})
    })  
  })
}

shinyApp(ui,server)

推荐阅读