Доступ к блестящему идентификатору модуля в функции сервера модулей - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу получить доступ к идентификатору, переданному в блестящий компонент пользовательского интерфейса модулей, и к callModule внутри соответствующего серверного компонента модуля. Мое намерение состоит в том, чтобы использовать идентификатор, предоставленный пользователем, чтобы добавить заголовок во всплывающее модальное окно.

library(shiny)

fooModuleUI <- function(id) {
  ns <- NS(id)

  list(
    actionButton(inputId = ns("show"), label = "Show")
  )
}


fooModule <- function(input, output, session) {
  # I want to be able to access the id of the module here so that I can use it
  # to construct the title to the modal
  observeEvent(input$show, {
    showModal(
      modalDialog(
        title = paste0("Add ", "Module id here"), # Want module id here
        footer =
          div(
            modalButton("Cancel"),
            actionButton("insert", "Save")
          )
      )
    )
  })

}


ui <- shiny::fluidPage(
  fooModuleUI("test")
)

server <- function(input, output, session) {
  callModule(fooModule, "test")
}

shiny::shinyApp(ui, server)

1 Ответ

1 голос
/ 06 ноября 2019

Это что-то вроде хака, использующего session$ns (который обычно используется для создания выходов модуля и т. Д.). С его помощью вы можете создать образец идентификатора и извлечь из него идентификатор модуля.

fooModule <- function(input, output, session) {
  x <- session$ns('tmp')  # make an ID string
  mod_id <- substr(x, 1, nchar(x)-4)  # remove last 3 characters, ie "-tmp"

  observeEvent(input$show, {
    showModal(
      modalDialog(
        title = paste0("Add ", mod_id), # Want module id here
        footer =
          div(
            modalButton("Cancel"),
            actionButton("insert", "Save")
          )
      )
    )
  })
}

Более чистым методом будет передача идентификатора модуля в качестве дополнительного аргумента при вызове callModule, например:

fooModule <- function(input, output, session, mod_id) {
  observeEvent(input$show, {
    showModal(
      modalDialog(
        title = paste0("Add ", mod_id), # Want module id here
        footer =
          div(
            modalButton("Cancel"),
            actionButton("insert", "Save")
          )
      )
    )
  })
}
server <- function(input, output, session) {
  callModule(fooModule, "test", mod_id='test')
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...