是否可以使用 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)
其中一个技巧是在特定单元格上添加一个监听
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 上的某处),并且只有在表格完成后才会呈现该单元格画画。
长话短说,有很多理由让你不应该使用这个技巧,但至少可以做到。