如何修改下面的闪亮代码来获取复选框选中的行索引?

问题描述 投票:0回答:1

我有兴趣在我的

shiny
应用程序中拥有如下数据表。使用复选框选择行后,我想继续处理所选数据。现在的问题是我不知道如何从此示例中获取所选行的索引。你能帮忙吗?

如何在 Shiny 中使用 DT::datatable 制作持久复选框?

我认为这与

callback
功能有关。但我无法弄清楚。

r checkbox shiny datatable dt
1个回答
0
投票

如果您想获取单击复选框的行索引,您可以定义一个函数,该函数获取输入的每个

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)
© www.soinside.com 2019 - 2024. All rights reserved.