Как запустить реактивный фоновый процесс в блестящем 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.

0 ответов

Другие вопросы по тегам