Рассылка обновлений * звонков в модули Shiny - PullRequest
1 голос
/ 10 января 2020

Я реализовывал модуль Shiny, который позволяет пользователям обновлять внутренние компоненты извне, как если бы это был «общий» элемент управления Shiny.
Идея заключалась в том, чтобы имитировать механизм Shiny (например, изменить textInput через функция updateTextInput), предоставляя функцию обновления (updateTextInModule), которая знает о внутренней структуре, но скрывает ее для пользователя.

Для этого необходимо получить доступ к полностью определенному идентификатору элемент управления: сюда входит идентификатор модуля, который я нигде не смог найти (если пользователь не указал его в вызове).

Мне удалось написать этот код, который отлично работает:

library(shiny)

# Module ------------------------------------------------------------------

# UI: a single textInput to be modified
module_ui <- function(id){
   ns <- NS(id)
   textInput(ns('txt_input'), label = 'Update me:', value = 'Original text')
}

module_server <- function(input, output, session){
   ns <- session$ns
}

# Updater function
#
# forwards the call to updateTextInput inside the module
updateTextInModule <- function(session, module_id, ...) {
   shiny::updateTextInput(session = session, inputId = NS(module_id, id = 'txt_input'), ...)
}

# Main app ----------------------------------------------------------------

# The module UI, and a button that updates it.
ui <- bootstrapPage(
   module_ui("module_id_ui_1"),

   actionButton('btn_update', 'Update the text!')
)

server <- function(input, output, session) {   
   callModule(module_server, "module_id_ui_1")

   observeEvent(input$btn_update, {
      updateTextInModule(session, module_id = "module_id_ui_1", value = 'Updated!')
   })
}

# Runner ------------------------------------------------------------------

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

(Конечно, это пример, нужно ограничить точки ... в updateTextInModule, чтобы ограничить интерфейс.)

Вопросы:

  1. Это хорошая практика ввести такие функции? Вызов NS звучит хаки sh, но это то, что Шини использует для создания идентификатора.
  2. Я что-то упустил? Можно ли сделать лучше?

Спасибо!

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