R 带有复选框和分页的数据表

R 带有复选框和分页的数据表,r,shiny,dt,R,Shiny,Dt,我正在尝试创建一个带有预选复选框的R中分页的数据表。其他示例(例如)不考虑分页 在下面的示例中,当您返回页面时,复选框状态将重置。此外,变量excludedrows不计算在其他页面上检查的行数 library(shiny) library(DT) ui = fluidPage( tags$script(HTML('$(document).on("click", "input", function () { var checkboxes = document.getElementsByName

我正在尝试创建一个带有预选复选框的R中分页的数据表。其他示例(例如)不考虑分页

在下面的示例中,当您返回页面时,复选框状态将重置。此外,变量excludedrows不计算在其他页面上检查的行数

library(shiny)
library(DT)

ui = fluidPage(

tags$script(HTML('$(document).on("click", "input", function () {
var checkboxes = document.getElementsByName("row_selected");
var checkboxesChecked = [];
for (var i=0; i<checkboxes.length; i++) {

if (checkboxes[i].checked) {
checkboxesChecked.push(checkboxes[i].value);
}}
Shiny.onInputChange("checked_rows",checkboxesChecked);
})')),

  verbatimTextOutput("excludedRows"),
  DTOutput('myDT')
)

server = function(input, output) {

  mymtcars_reactive <- reactive(mtcars)

  output$myDT <- renderDataTable({

    mymtcars <- mymtcars_reactive()
    mymtcars[["Select"]] <- paste0('<input type="checkbox" name="row_selected" value=',1:nrow(mymtcars),' checked>')

    datatable(mymtcars,selection = "multiple",
          options = list(pageLength = 14,
                         lengthChange = FALSE,
                         stateSave = TRUE),
          rownames= FALSE,
          escape=F)
  })

  output$excludedRows <- renderPrint({
    intersect(input$checked_rows,1:nrow(mymtcars_reactive()))
  })
}

shinyApp(ui,server, options = list(launch.browser = TRUE)
库(闪亮)
图书馆(DT)
ui=fluidPage(
标记$script(HTML('$(文档)。在(“单击”,“输入”,函数)(){
var复选框=document.getElementsByName(“选定行”);
var checkboxesChecked=[];
对于(var i=0;i,这里有一种方法:

library(shiny)
library(DT)

mymtcars <- mtcars
mymtcars[["Select"]] <- paste0('<input type="checkbox" name="row_selected" value=',1:nrow(mymtcars),' checked>')
mymtcars[["_id"]] <- paste0("row_", seq(nrow(mymtcars)))

callback <- c(
  sprintf("table.on('click', 'td:nth-child(%d)', function(){", 
          which(names(mymtcars) == "Select")),
  "  var checkbox = $(this).children()[0];",
  "  var $row = $(this).closest('tr');",
  "  if(checkbox.checked){",
  "    $row.removeClass('excluded');",
  "  }else{",
  "    $row.addClass('excluded');",
  "  }",
  "  var excludedRows = [];",
  "  table.$('tr').each(function(i, row){",
  "    if($(this).hasClass('excluded')){",
  "      excludedRows.push(parseInt($(row).attr('id').split('_')[1]));",
  "    }",
  "  });",
  "  Shiny.setInputValue('excludedRows', excludedRows);",
  "});"
)

ui = fluidPage(
  verbatimTextOutput("excludedRows"),
  DTOutput('myDT')
)

server = function(input, output) {

  output$myDT <- renderDT({

    datatable(
      mymtcars, selection = "multiple",
      options = list(pageLength = 5,
                     lengthChange = FALSE,
                     rowId = JS(sprintf("function(data){return data[%d];}", 
                                        ncol(mymtcars)-1)),
                     columnDefs = list( # hide the '_id' column
                       list(visible = FALSE, targets = ncol(mymtcars)-1)
                     )
      ),
      rownames = FALSE,
      escape = FALSE,
      callback = JS(callback)
    )
  }, server = FALSE)

  output$excludedRows <- renderPrint({
    input[["excludedRows"]]
  })
}

shinyApp(ui,server, options = list(launch.browser = TRUE))
库(闪亮)
图书馆(DT)

mymtcars您是否尝试在
DT::renderDataTable
中设置
server=FALSE
server=FALSE
解决了重置选中状态的问题,但没有给出正确的
input$checked_rows
值,该值仍然只统计当前页面上的选中项。在我的实际用例中,mymtcars是一个reac动态元素
mymtcars()
,具有动态长度。因此,我尝试将回调JS直接放在datatable脚本`callback=JS(c(printf)(“table.on”)中的服务器中(“…”,但这不起作用。@5有一个动态的列数?你能编辑你的问题来发布这样一个例子吗?好的,我已经更改了这个例子,这样就有了一个反应性元素,它被做成了一个datatable。回调的这部分`sprintf(“table.on('click','td:nth child(%d'),function()”,其中(name(mymtcars)=“Select”)),`不能引用reactive(mymtcars)而不是mymtcars,因为它在服务器函数之外。@第五,如果我举这个例子,如果将回调脚本放在
renderDT
中,我看不到任何问题。那么问题出在哪里?好的,我犯了一个小错误(missed,server=FALSE)。非常感谢,它可以工作。