R语言 如何在Shiny中使用DT::datatable创建持久复选框?

ig9co6j1  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(123)

使用this answer,我在Shiny中创建了一个DT::datatable,其中包含一列复选框,但我遇到了一个问题,如果我选中一些复选框,转到表上的另一个页面,然后返回到原始页面,则这些复选框现在未选中。如何在切换页面时使复选框检查持久化?下面是一个简单的例子:

library(shiny)
library(DT)
runApp(
  list(ui = fluidPage(
    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
      }
      
      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)
      })
    })
)

字符串

0lvr5msh

0lvr5msh1#

为了在页面之间移动时保持复选框状态,必须禁用服务器端处理。您可以通过使用server = FALSE调用DT::renderDataTable来设置此设置。


的数据
完整的最小示例:

library(shiny)
library(DT)
runApp(list(
    ui = fluidPage(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
        }
        
        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)
    }
))

字符串

ctehm74n

ctehm74n2#

为了在RShinyDataTable中切换页面时使复选框状态持久化,可以使用服务器端处理,并将复选框输入与DataTable本身分开处理。下面是代码的更新版本,演示了这一点:

library(shiny)
library(DT)

runApp(
  list(ui = fluidPage(
    dataTableOutput("dtout")),
    server = function(input, output, session) {
      
      shinyInput <- function(FUN, id, num, values = NULL, ...) {
        inputs <- character(num)
        for (i in seq_len(num)) {
          inputs[i] <- as.character(FUN(paste0(id, i), label = NULL, value = values[i], ...))
        }
        inputs
      }
      
      # Store checkbox values in a reactiveValues object
      checkboxValues <- reactiveValues(values = rep(FALSE, nrow(mtcars)))
      
      observe({
        # Update checkbox values when checkboxes are changed
        for (i in seq_along(checkboxValues$values)) {
          checkboxId <- paste0("srows_", i)
          checkboxValues$values[i] <- input[[checkboxId]]
        }
      })
      
      output$dtout <- renderDataTable({
        # Add a column for checkboxes dynamically based on checkboxValues$values
        datatable(
          cbind(Pick = shinyInput(checkboxInput, "srows_", nrow(mtcars), values = checkboxValues$values, width = 1), mtcars),
          options = list(
            drawCallback = JS('function(settings) {Shiny.unbindAll(this.api().table().node()); Shiny.bindAll(this.api().table().node());}'),
            serverSide = TRUE # Enable server-side processing
          ),
          selection = 'none', escape = FALSE
        )
      }, server = TRUE) # Set server = TRUE to enable server-side processing
      
      # Update checkbox values when the table is re-rendered
      observeEvent(input$dtout_state_change$page, {
        selectedRows <- input$dtout_rows_selected
        if (!is.null(selectedRows)) {
          for (i in seq_along(checkboxValues$values)) {
            checkboxValues$values[i] <- i %in% selectedRows
          }
        }
      })
      
    })
)

字符串
在此修改后的代码中:
1.我们将复选框的值存储在一个名为checkboxValuesreactiveValues对象中。这允许我们跟踪每个复选框的状态。
1.当任何复选框被更改时,我们使用观察器更新checkboxValues。这可确保值始终是最新的。
1.在renderDataTable函数中,我们使用shinyInput函数动态生成复选框。我们传入values参数,用checkboxValues中的存储值初始化复选框。
1.我们通过在datatable选项中设置serverSide = TRUE来启用服务器端处理。这允许DataTable高效地处理分页和其他操作。
1.我们使用一个观察器来更新checkboxValues,每当表被重新呈现时。这确保了复选框值即使在切换页面时也保持不变。
通过这些修改,在DataTable中切换页面时,复选框状态现在应该保持不变。
如果你有任何进一步的问题,请告诉我!

相关问题