При работе с функцией 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)