R语言DT包中能否保存表格编辑内容?
Hey there! Great question—this is a super common point of confusion when working with DT's editing feature. Let me break this down for you:
Why the default edit doesn't update your data.frame
DT renders your table in the browser (frontend), while your original data.frame lives in your R session (backend). These are separate environments, so edits you make in the visual table don't automatically sync back to the R object by default. That's why your manual df[1,2] <- 76 style edits still work directly, but DT's frontend edits don't carry over unless you set up a bridge between the two.
How to sync edits to your underlying data (the part you might have missed)
You need to use Shiny's reactive framework to capture the edit events from the DT table and update your data.frame accordingly. Here's a simple, working example:
library(shiny) library(DT) ui <- fluidPage( DTOutput("editable_table") ) server <- function(input, output, session) { # Store your data in a reactive value (so it can be updated dynamically) reactive_data <- reactiveVal(data.frame( Number = c(10, 20, 30), Text = c("apple", "banana", "cherry"), stringsAsFactors = FALSE )) # Render the editable DT table output$editable_table <- renderDT({ datatable(reactive_data(), editable = TRUE) }) # Capture edit events and update the underlying data observeEvent(input$editable_table_cell_edit, { edit_info <- input$editable_table_cell_edit row_idx <- edit_info$row col_idx <- edit_info$col new_value <- edit_info$value # Update the reactive data with the new value updated_df <- reactive_data() updated_df[row_idx, col_idx] <- new_value reactive_data(updated_df) # Optional: Print the updated data to the console to verify cat("Updated data:\n") print(reactive_data()) }) } shinyApp(ui, server)
When you run this Shiny app, any edits you make in the table will instantly update the reactive_data object (which acts as your editable data.frame).
What if you're using R Markdown instead of a standalone Shiny app?
You can use the same approach with the runtime: shiny option in your R Markdown document:
--- title: "DT Editing in R Markdown" runtime: shiny --- ```{r setup, include=FALSE} library(DT)
# Reactive storage for our data reactive_df <- reactiveVal(data.frame( ID = 1:5, Value = c(100, 200, 300, 400, 500) )) # Render editable table renderDT({ datatable(reactive_df(), editable = TRUE) }) # Sync edits to reactive data observeEvent(input$table_cell_edit, { info <- input$table_cell_edit updated <- reactive_df() updated[info$row, info$col] <- info$value reactive_df(updated) }) # Show the updated data below the table renderPrint({ reactive_df() })
## Is this a feature that could be enhanced? DT's design intentionally separates frontend rendering from backend R data—since it's primarily an HTML table library, it doesn't assume you're working in a Shiny environment by default. That said, if you think the sync process could be simplified (e.g., a built-in function to auto-sync edits to a `data.frame`), you could absolutely submit a feature request to the DT GitHub repository. For now, though, using Shiny's reactive tools is the standard, supported way to achieve the "edit + save" workflow you're looking for. 内容的提问来源于stack exchange,提问作者pssguy

