Как запустить реактивный фоновый процесс в блестящем R?
Я написал код, который выполняет долгий расчет, в рамках которого обновляются несколько элементов пользовательского интерфейса, показывая часть хода и результатов вычислений. Я хотел бы, чтобы пользователь мог запускать более одного расчета одновременно и иметь возможность проверять ход выполнения и результаты.
Это пример кода приложения:
#EXAMPLE APP----
#Libraries----
library(shiny)
library(shinyjs)
#UI code----
ui <- fluidPage(
useShinyjs(),
sidebarLayout(
sidebarPanel(
actionButton(
'pressme',
'Press me'
)
),
mainPanel(
div(
id='inmainP'
)
)
)
)
#Server code----
server <- function(input, output, session) {
clicks <- reactiveValues()
clicks$count <- 0
##Adding the UI elements necesary when pressing the button----
observeEvent(input$pressme,{
clicks$count <- clicks$count + 1
insertUI(
'#inmainP',
'beforeEnd',
div(id=paste0('Pcontainer',clicks$count),
p(tags$b(paste0(clicks$count,'-Process'))),
style = 'border:solid thin black;text-align: center;')
)
insertUI(
paste0('#Pcontainer',clicks$count),
'beforeEnd',
textOutput(paste0('process',clicks$count,'1'))
)
insertUI(
paste0('#Pcontainer',clicks$count),
'beforeEnd',
textOutput(paste0('process',clicks$count,'2'))
)
insertUI(
paste0('#Pcontainer',clicks$count),
'beforeEnd',
textOutput(paste0('process',clicks$count,'3'))
)
###Creating input to observe to do long calculation----
#This is done because it is the only way that I've accomplished, in the real app,
#that new elements render before starting calculation
runjs(
paste0('
Shiny.setInputValue("start",',clicks$count,')
')
)
})
##Runing long calculation----
observeEvent(input$start,{
odd <- 1
even <- 1
for (i in 1:10) {
Sys.sleep(1)
html(paste0('process',clicks$count,'1'), i)
if((i%%2)==0){
html(paste0('process',clicks$count,'2'), even)
even <- even + 1
}else{
html(paste0('process',clicks$count,'3'), odd)
odd <- odd + 1
}
}
})
}
shinyApp(ui, server)
Как вы заметите, это приложение работает отлично, но новые процессы запускаются только после завершения предыдущих. Я хотел бы решить эту проблему с помощью пакета callr, который мне удалось использовать в других длинных заданиях в приложении, но я не знаю, как правильно его использовать здесь. Любые другие предложения, основанные на использовании других пакетов в качестве обещаний или будущего, также приветствуются.
Как я уже упоминал, я пытался решить эту проблему с помощью callr, но мне не удалось программно создать eventReact(s), необходимые для запуска каждого фонового задания (насколько я понимаю). И я не понимаю, как сделать обновление пользовательского интерфейса из фонового процесса. Как фоновые процессы работают в R?
Ссылка на этот вопрос в RStudioCommunity.