闪亮的模块:如何使用 DT::datatables 访问 selected_rows?
Shiny modules: how to access selected_rows with DT::datatables?
当使用 shiny 模块和 DT::datatable 我想访问 selected_rows 服务器端。
如果我的 DT:datatable ID 是 my_DT_table
那么我希望对象 input$my_DT_table_selected_rows
包含所选行的索引。
这在没有模块的闪亮应用程序中非常有效。
但是,如果我使用模块,则此方法不再有效,输入对象 input$my_DT_table_selected_rows
不再包含所选行的索引。
使用 DT:datatable 函数时,我们可以使用内置功能来了解 UI 中的选定行。
对象:input$my_DT_table_rows_selected
包含所选行的索引,其中 my_DT_table
是 DT::datatable 的 ID。
但是,在使用模块时,table 的名称现在不同了。它有一个前缀,等于用于调用模块的 UI 函数的 ID。
因此,如果该 ID 为 my_ID
,则 table 名称将变为:my_ID-table_name
(注意 ID 后面的连字符)。
这可以使用浏览器中的开发人员工具轻松验证(例如 FireFox 中的检查器)。
然后关联的输入对象名称变为(我们需要反引号以防止 R 将连字符解释为减号):
input$`my_ID-table_name_rows_selected`
这是一个非常基本的示例,其中包含一些关于如何将反应对象传递给模块的额外学习。反应对象包含所选行的索引。我需要不带括号地传递它。在 module_server 函数内部,我用括号引用反应对象。
UI 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)
当使用 shiny 模块和 DT::datatable 我想访问 selected_rows 服务器端。
如果我的 DT:datatable ID 是 my_DT_table
那么我希望对象 input$my_DT_table_selected_rows
包含所选行的索引。
这在没有模块的闪亮应用程序中非常有效。
但是,如果我使用模块,则此方法不再有效,输入对象 input$my_DT_table_selected_rows
不再包含所选行的索引。
使用 DT:datatable 函数时,我们可以使用内置功能来了解 UI 中的选定行。
对象:input$my_DT_table_rows_selected
包含所选行的索引,其中 my_DT_table
是 DT::datatable 的 ID。
但是,在使用模块时,table 的名称现在不同了。它有一个前缀,等于用于调用模块的 UI 函数的 ID。
因此,如果该 ID 为 my_ID
,则 table 名称将变为:my_ID-table_name
(注意 ID 后面的连字符)。
这可以使用浏览器中的开发人员工具轻松验证(例如 FireFox 中的检查器)。
然后关联的输入对象名称变为(我们需要反引号以防止 R 将连字符解释为减号):
input$`my_ID-table_name_rows_selected`
这是一个非常基本的示例,其中包含一些关于如何将反应对象传递给模块的额外学习。反应对象包含所选行的索引。我需要不带括号地传递它。在 module_server 函数内部,我用括号引用反应对象。
UI 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)