我有兴趣在我的
shiny
应用程序中拥有如下数据表。使用复选框选择行后,我想继续处理所选数据。现在的问题是我不知道如何从此示例中获取所选行的索引。你能帮忙吗?
如何在 Shiny 中使用 DT::datatable 制作持久复选框?
我认为这与
callback
功能有关。但我无法弄清楚。
如果您想获取单击复选框的行索引,您可以定义一个函数,该函数获取输入的每个
id
的值
shinyValue = function(id, len) {
unlist(lapply(seq_len(len), function(i) {
value = input[[paste0(id, i)]]
if (is.null(value)) {
NA
}
else {
value
}
}))
}
并将这些值写入数据框:
df <- data.frame(isChecked = shinyValue('srows_', nrow(mtcars)))
然后您可以使用以下方法获得这些索引的列表
which(df$isChecked == TRUE)
请参阅下面的最小示例:
library(shiny)
library(DT)
ui <- fluidPage(verbatimTextOutput("idxSelectedRows"),
dataTableOutput("dtout"))
server <- function(input, output, session) {
shinyInput <- function(FUN, id, num, ...) {
inputs <- character(num)
for (i in seq_len(num)) {
inputs[i] <- as.character(FUN(paste0(id, i), label = NULL, ...))
}
inputs
}
shinyValue = function(id, len) {
unlist(lapply(seq_len(len), function(i) {
value = input[[paste0(id, i)]]
if (is.null(value)) {
NA
}
else {
value
}
}))
}
output$idxSelectedRows <- renderPrint({
df <- data.frame(isChecked = shinyValue('srows_', nrow(mtcars)))
paste("Selected row indices: ",
paste(which(df$isChecked == TRUE), collapse = ", "))
})
output$dtout <- renderDataTable({
datatable(
cbind(
Pick = shinyInput(
checkboxInput,
"srows_",
nrow(mtcars),
value = NULL,
width = 1
),
mtcars
),
options = list(
drawCallback = JS(
'function(settings) {Shiny.bindAll(this.api().table().node());}'
)
),
selection = 'none',
escape = F
)
}, server = FALSE)
}
shinyApp(ui = ui, server = server)