R Shiny - отменить вызов - PullRequest
1 голос
/ 05 мая 2020

Есть ли способ отменить callModule? Вариант использования - у меня есть переменное количество модулей - количество зависит от выбора пользователя. Допустим, пользователь выбирает 10, а затем другой 10 - есть ли способ удалить исходные 10? Это происходит автоматически? Я беспокоюсь, что память занята и не освобождена. $ people изменяется, модуль с people_info_server вызывается для каждого элемента input $ people и генерирует страницу информации для каждого человека.

Я бы хотел сделать что-то вроде этого:

observeEvent(
  input$people
, {
  remove_existing_calls(people_info_server) # Not sure how to define this function
  input$people %>% 
    walk(
      ~callModule(people_info_server, .x)
    )
  }
)

1 Ответ

1 голос
/ 05 мая 2020

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

library(shiny)

## module definition
module_with_destructor <- function(input, output, session) {
  output$plot <- renderPlot({
    plot(1:input$n)
  })
  destructor <- function() {
    # add more cleanup logic here
    output$plot <- NULL
  }
  return(destructor)
}

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

## main app (client)
myenv <- new.env()
observeEvent(input$create_module, {
  if (is.null(myenv$destructor))
    myenv$destructor <- callModule(module_with_destructor, "module_id")
})

observeEvent(input$destroy_module, {
  if (!is.null(myenv$destructor))
    myenv$destructor()
})

Конечно, вам придется реализовать несколько дополнительных logi c, чтобы использовать эту идею с динамическим c количеством модулей. Однако в вашем случае вы можете просто создать список, который собирает все отдельные деструкторы, а затем перебирать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...