Блестящие модули: как получить доступ к selected_rows с помощью DT :: datatables? - PullRequest
0 голосов
/ 21 января 2020

При использовании блестящих модулей и DT :: datatable я хотел бы получить доступ к серверному серверу selected_rows. Если мой DT: datatable ID равен my_DT_table, то я ожидаю, что объект input$my_DT_table_selected_rows содержит индекс выбранной строки. Это прекрасно работает в блестящих приложениях без модулей.

Однако, если я использую модули, этот подход больше не работает, и входной объект input$my_DT_table_selected_rows больше не содержит индекс выбранной строки.

1 Ответ

0 голосов
/ 21 января 2020

При работе с функцией DT: datatable мы можем использовать встроенную функциональность для изучения выбранных строк в пользовательском интерфейсе.

Объект: input$my_DT_table_rows_selected содержит индекс выбранной строки, где my_DT_table - это идентификатор DT :: datatable.

Однако при работе с модулями имя таблицы теперь другое. У него есть префикс, который равен идентификатору, используемому для вызова функции пользовательского интерфейса модуля. Таким образом, если этот идентификатор равен my_ID, тогда имя таблицы станет: my_ID-table_name (обратите внимание на дефис после идентификатора). Это можно легко проверить с помощью инструментов разработчика в вашем браузере (например, инспектор в FireFox). И имя связанного входного объекта тогда становится (и нам нужны обратные галочки, чтобы R не интерпретировал дефис как знак минуса):

input$`my_ID-table_name_rows_selected`

Вот очень простой пример c с некоторым дополнительным изучением относительно как передать реактивный объект в модуль. Реактивный объект содержит индекс выбранной строки. Мне нужно передать это без скобок. Внутри функции module_server я ссылаюсь на реактивный объект с круглыми скобками.

Модуль пользовательского интерфейса в ui_module.R

module_ui <- function(id) {
  ns <- NS(id) # create namespace

  tagList(
    fluidRow(column(6, DT::dataTableOutput(ns("dt_table")))),
    fluidRow(column(4, verbatimTextOutput(ns("render_selected_line"))))
  )
}

Серверный модуль в server_module.R

table_server <- function(input, output, session, data) {

  output$dt_table <- DT::renderDataTable(
    DT::datatable(
    data = data,
    selection = "single"
    )
  )
}

selected_line_server <- function(input, output, session, data) { 
  output$render_selected_line <- renderText({
    paste0("My selection was: ", data()) # refer to the reactive object with parenthesis
  })

}

Блестящее приложение

library(shiny)
library(dplyr)
library(DT)

source("./modules/ui_module.R")
source("./modules/server_module.R")

ui <- fluidPage(
  module_ui("my_ID")
)

server = function(input, output, session) {
  data <- mtcars
  callModule(table_server, id = "my_ID", data = data) # data is not reactive
  callModule(selected_line_server, id = "my_ID", data = selectedLine) # refer to the reactive object selectedLine without parenthesis

  selectedLine <- reactive({
    req(input$`my_ID-dt_table_rows_selected`)
    if (is.null(input$`my_ID-dt_table_rows_selected`)) {
      return(NULL)
    } else {
      rows_selected <- as.numeric(input$`my_ID-dt_table_rows_selected`) # we need to prefix dt_table_rows_selected with the ID of the UI function "my_ID" and a hyphen
    }
  })

}

shinyApp(ui = ui, server = server)
...