Shiny: Возможно ли, чтобы реактивный код работал рядом с наблюдающей ()? - PullRequest
0 голосов
/ 27 апреля 2018

В следующем приложении Shiny длинные вычисления выполняются при нажатии кнопки действия (run). Выход отображается в конце расчета.

Часы показаны в приложении. Пока идет длинный расчет, часы не обновляются.

Можно ли обновлять часы во время расчета?

Код:

library(shiny)

n <- c(1:42E7)

ui <- fluidPage(
  actionButton(inputId = "run", label = "Run a long calculation"),
  verbatimTextOutput("calc"),
  verbatimTextOutput("time")
)

server <- function(input, output) {

  x <- observeEvent(input$run,{
    output$calc <- renderText({
      head(sqrt(n))
    })
  })


  output$time <- renderText({
    invalidateLater(1000)
    print(as.character(Sys.time()))
  })

}

shinyApp(ui = ui, server = server)

Спасибо в ожидании,

Chris

1 Ответ

0 голосов
/ 27 апреля 2018

Этот ответ пока не работает, я поставил его здесь, чтобы вы могли ответить за меня.

Вам необходимо выполнить обновление до версии Shiny (remotes::install_github("rstudio/shiny")).

Я заменил ваш игрушечный пример на Sys.sleep(), потому что передача большого вектора требовала повышения параметра future.globals.maxSize и все равно вызывала крах моей машины.

library(shiny)
library(promises)
library(future)
plan(multiprocess)

ui <- fluidPage(
  actionButton(inputId = "run", 
               label = "Run a long calculation"),
  verbatimTextOutput("calc"),
  verbatimTextOutput("time")
)

server <- function(input, output, session) {

  observeEvent(input$run,{
    output$calc <- renderText({
      future({
        Sys.sleep(5)
        42
      }) %...>% 
        head() %...>% 
        print()
    })
  })

  output$time <- renderPrint({
    invalidateLater(1000)
    as.character(Sys.time())
  })

}

shinyApp(ui = ui, server = server)

Я ожидал, что это сработает, но «дорогая операция» все еще блокирует, я еще не понял, почему. Надеюсь, это все еще будет полезно.

ref: https://rstudio.github.io/promises

...