繁体   English   中英

使用 Javascript 在 Shiny 应用程序中删除 DataTable 行

[英]Delete DataTable rows in Shiny app using Javascript

我正在尝试使用 Javascript 从 Shiny 应用程序中的数据表中删除行。 在表中,我有一列,每一行都有一个“删除”按钮。 这或多或少是我想要做的,但我无法让它工作。

在我的 server.R 中:

  initComplete <- DT::JS(
    "function  () {",
    "  var table = this.api();",
    "  $('#delete_button').on('click', function() {",
    "    table.row($(this).parents('tr')).remove().draw();",
    "  });",
    "}"
  )


  shinyInput <- function(FUN, len, id, ...) {
    inputs <- character(len)
    for (i in seq_len(len)) {
      inputs[i] <- as.character(FUN(paste0(id, i), ...))
    }
    inputs
  }

  output$under_list <- renderDataTable({
    list_under <- getListUnder() # this is a reactive
    list_under$Delete <- shinyInput(actionButton, nrow(list_under),'delete_',label = "Delete",icon=icon("trash"),
                                    style = "color: red;background-color: white",
                                    onclick = paste0("Shiny.setInputValue( \"delete_button\" , this.id, {priority: \"event\"})"))
    table <- list_under %>%
      DT::datatable(filter = "none", rownames = F
                    ,extensions = 'FixedColumns'
                    ,options = list(pageLength = 10,scrollX = TRUE,
                                    fixedColumns = list(leftColumns = 2),
                                    initComplete = initComplete),
                    escape=F
      ) %>%
      formatCurrency(c(5,8,9,11,15),digits=2,currency='€') %>%
      formatPercentage(13:14)
  })
library(DT)
library(shiny)

rowNames = FALSE # whether to show row names
colIndex <- as.integer(rowNames)

dat = iris[1:5,]

dat[["Action"]] <- vapply(seq_len(nrow(dat)), function(i){
  as.character(tags$button("delete", id = paste0("delete-",i), `data-index` = i))
}, FUN.VALUE = character(1L))
dat[["rowId"]] <- paste0("row-", seq_len(nrow(dat)))

callback <- JS(
  '$("button[id^=delete]").on("click", function() {',
  '  var index = $(this).data("index");',
  '  var rowId = "#row-" + index;',
  '  table.row(rowId).remove().draw();',
  '});'
)

datatable(
  dat,
  rownames = rowNames,
  escape = -ncol(dat)+1L,
  callback = callback,
  options = list(
    rowId = JS(sprintf("function(data){return data[%d];}",
                       ncol(dat)-1L+colIndex)),
    columnDefs = list(
      list(visible = FALSE, targets = ncol(dat)-1L+colIndex),
      list(className = "dt-center", targets = "_all")
    )
  )
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM