禁用特定单元格DT的编辑

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

是否可以使用 RShiny DT 仅禁用特定单元格的编辑(按列和行索引)?

例如在下一个代码示例中,仅应禁用包含“Mary”的单元格。 所有其他单元格都应该是可编辑的。

library(shiny)
library(DT)

# Sample data (you can replace this with your own dataset)
dat <- data.frame(
  userName = c("John", "Mary", "Mike"),
  start = c("06/08/2019", "01/01/2019", "23/10/2019"),
  stringsAsFactors = FALSE
)

ui <- fluidPage(
  titlePanel("Editable Datatable Example"),
  DTOutput("userTable")
)

server <- function(input, output, session) {
  output$userTable <- renderDT({
    datatable(dat, editable = TRUE, rownames = FALSE)
  })
  
  observeEvent(input$userTable_cell_edit, {
    # Handle cell edits here (e.g., update the underlying data)
    # For demonstration purposes, we'll just print the edited value
    cat("Edited value:", input$userTable_cell_edit$value, "\n")
  })
}

shinyApp(ui = ui, server = server)
r shiny dt
1个回答
0
投票

其中一个技巧是在特定单元格上添加一个监听

dblclick
的事件处理程序,以阻止事件到达触发编辑对话框的处理程序:

datatable(dat, 
          editable = TRUE, 
          rownames = FALSE,
          callback = JS("
            table.on('draw', function() {
              $('#userTable > div > table > tbody > tr.even > td:nth-child(1)').
                on('dblclick', function(e) {
                  e.stopPropagation()
                })
            });"))
})

这是一个非常脆弱的黑客行为,您应该仔细考虑如何正确地处理单元格(也许单元格值得拥有自己的

id
以独特的方式解决它?)。

callback
是必要的,因为我们想要将事件侦听器添加到该单元格(而不是在原始编辑侦听器之后之后触发的 satck 上的某处),并且只有在表格完成后才会呈现该单元格画画。

长话短说,有很多理由让你不应该

使用这个技巧,但至少可以做到。

© www.soinside.com 2019 - 2024. All rights reserved.