Я реализовывал модуль 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
, чтобы ограничить интерфейс.)
Вопросы:
- Это хорошая практика ввести такие функции? Вызов
NS
звучит хаки sh, но это то, что Шини использует для создания идентификатора. - Я что-то упустил? Можно ли сделать лучше?
Спасибо!