Как вы можете использовать selecticizeGroupInput с future_promise?

Я использую будущее обещание более эффективно вызывать мои данные. Однако я обнаружил, что мои фильтры (вызываемые через selecticizeGroupServer) не работают с будущим обещанием.

См. прилагаемый минимальный воспроизводимый пример. Фильтры работают, как и ожидалось, когда я удаляю функцию «future_promise» из выражения, реагирующего на данные. Однако, когда я использую «future_promise», модуль фильтра дает сбой.

Не могли бы вы помочь мне понять, что я делаю неправильно?

      library(shiny)
library(future)
library(promises)
library(shinyWidgets)

plan(multisession)

ui <- fluidPage(

    titlePanel("Example App"),

    sidebarLayout(
        sidebarPanel(),
        mainPanel(
          selectizeGroupUI(
            id = "filters",
            inline = FALSE,
            params = list(
              `mpg` = list(inputId = "mpg", title = "mpg", placeholder = "All"),
              `cyl` = list(inputId = "cyl", title = "cyl", placeholder = "All"),
              `disp` = list(inputId = "disp", title = "disp", placeholder = "All")
            )
          )
        )
    )
)

server <- function(input, output) {

  data <- reactive({
    
    future_promise({

      mtcars

    })

  })

  filter_mod <- reactive({})
  
  observe({
    
    filter_mod <<- callModule(
      module = selectizeGroupServer,
      id = "filters",
      inline = FALSE,
      data = data,
      vars = c("mpg", "cyl", "disp")
    )
    
  })
  
}

# Run the application 
shinyApp(ui = ui, server = server)

1 ответ

Мы можем использовать инициализированный reactiveValвместо reactiveчтобы не давать обещание selectizeGroupServer.

Пожалуйста, проверьте следующее:

      library(shiny)
library(future)
library(promises)
library(shinyWidgets)

plan(multisession)

ui <- fluidPage(
  titlePanel("Example App"),
  sidebarLayout(
    sidebarPanel("The choices will appear after 5 seconds:"),
    mainPanel(
      selectizeGroupUI(
        id = "filters",
        inline = FALSE,
        params = list(
          `mpg` = list(inputId = "mpg", title = "mpg", placeholder = "All"),
          `cyl` = list(inputId = "cyl", title = "cyl", placeholder = "All"),
          `disp` = list(inputId = "disp", title = "disp", placeholder = "All")
        )
      )
    )
  )
)

server <- function(input, output, session) {
  data <- reactiveVal(NULL)
  
  future_promise({
    Sys.sleep(5) # long running task
    mtcars
  }) %...>% data() # assign to reactiveVal "data" once the future_promise is resolved
  
  filter_mod <- callModule(
    module = selectizeGroupServer,
    id = "filters",
    inline = FALSE,
    data = data,
    vars = c("mpg", "cyl", "disp")
  )
}

shinyApp(ui = ui, server = server)
Другие вопросы по тегам