r-是否有一种方法可以避免使用闪亮的重新计算绘制之间的闪烁



有没有一种方法可以避免使用闪亮的重新计算绘制之间的闪烁?

一旦无效(在我们的情况下,这意味着当值$a发生变化时(,无效机制(闪烁(会使绘图变灰,因此它们当前的显示不是最新的,但它们也没有完成对值$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)

您可以通过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)

最新更新