Передача значений реактивного сервера модулям

#r #shiny #shiny-reactivity

#r #блестящий #блестящий -реактивность

Вопрос:

У меня есть блестящее приложение с функцией сервера, например;

 shinyServer(function(input, output) {
 chosen_fam <- reactive({ input$fam })

  output$newui <- renderUI({  NewProductUI("newproduct", fam = chosen_fam()) })
  output$newbtn <- renderUI({ NewProductButtonUI("newproduct", fam =  chosen_fam()) })

  callModule(NewProduct, id = "newproduct", fam =  chosen_fam())
})
  

Внутри модуля NewProduct есть что-то вроде этого:

 NewProduct <- function(input, output, session, fam){
  observeEvent(input$submitnew, {
    print(paste0("Adding.... ", fam))

    row <- c(fam, input$variable)
    upload_to_googlesheets(token, row)
})
  

Пользовательский интерфейс отображается в зависимости от выбранного семейства, и серверный модуль также выполняет разные действия в зависимости от семейства.

Пользовательский интерфейс рендеринга, похоже, работает нормально, но переменная «fam» в callModule не обновляется (следовательно, это всегда результат первого выбранного семейства). Переменные из входных данных проходят нормально, поэтому я полагаю, что это как-то связано с областью видимости (возможно, он ищет «fam» в пространстве имен «newproduct»?).

Как мне явно указать callModule использовать реактивное выражение из пространства имен сеанса? Или есть способ, которым я могу просто добавить переменную fam в пространство имен «newproduct»?

Ответ №1:

Вы должны предоставить сам реактивный проводник:

 callModule(NewProduct, id = "newproduct", fam =  chosen_fam)
  

(без скобок). И в модуле:

 row <- c(fam(), input$variable)
  

(круглые скобки).