Je n'arrive pas à trouver la faille dans la logique de mon script qui provoque le blocage du processus Shiny malgré l'essai d'utiliser l'asynchronisme. future
+ promises
stratégie.
J'ai ce (simplifié) serveur script. Il fonctionne en principe, mais je n'expérimente pas la parallélisation. Je simule 2 déclenchements simultanés et le deuxième événement déclencheur attend que le premier se résolve.
Pouvez-vous indiquer ce qui ne va pas ici ? J'ai lu plusieurs manuels, mais j'ai toujours du mal à trouver la logique.
Minimal Example, une application Shiny à un seul fichier :
## load libs
library(shiny)
library(DT)
library(ggplot2)
ui <- navbarPage(
tabPanel(
" "
, sidebarLayout(
sidebarPanel(
br()
, actionButton(
"run_trends"
, label = "run"
, style="color: #fff; background-color: #337ab7; border-color: #2e6da4"
)
, br()
)
, mainPanel(
textOutput("trends_time")
, br()
, br()
, plotOutput('trend_plotly')
, br()
, p("results")
, br()
, DTOutput('trend_tbl')
, br()
, br()
)
)
)
)
server <- function(input, output, session)
{
dt_trend <- observeEvent(
input$run_trends,
{
## load libs
library(data.table)
library(ggplot2)
library(promises)
library(future)
plan(multiprocess)
dat_func <- function()
{
start_time <- Sys.time()
dt <- data.table(x = rnorm(100), y = rnorm(100))
trendy_tbl <- head(dt, 10)
ggplo1 <- ggplot(dt) + geom_point(aes(x=x,y=y))
Sys.sleep(10)
list(
trendy_tbl
, ggplo1
, paste0('time: ', round(Sys.time() - start_time), ' .')
)
}
f <- future({
dat_func()
})
#res <- future::value(f)
output$trend_tbl <- renderDT({future::value(f)[[1]]})
output$trend_plotly <- renderPlot({future::value(f)[[2]]})
output$trends_time <- renderText({future::value(f)[[3]]})
})
}
# Return a Shiny app object
shinyApp(ui = ui, server = server, options = list(port = 4600, host = '0.0.0.0'))