在 Shiny 中使用 DT table 计算 Editable

Editable calculation with DT table in Shiny

我已经研究了一段时间并阅读了很多书,但我仍然无法理解如何使这项工作发挥作用。有没有简单的解决办法?

我想在我的 shiny 应用程序中编辑 DT table,并且在编辑时,我希望对聚合两个值的列进行更改。

这是一个例子:

library(tidyverse)
library(shiny)
library(DT)

mt <- mtcars %>%
    select(mpg, cyl) %>%
    head()

ui <- fluidPage(
  
  DTOutput(outputId = "final_tbl")
)

server <- function(input, output){

  dat <- reactive({
    d <- mt %>%
      mutate(total = mpg + cyl)
    d
  })
    
  output$final_tbl <- renderDT({
    
    dat() %>%
      datatable(editable = TRUE)
    
  })
}

shinyApp(ui, server)

这会生成一个简单的 editable table,其中包含总计列,将 mpg 和 cyl 相加。我想要做的是编辑 cyl 值并将更改反映在总计列中。有没有简单的解决方案?

您需要使用 _cell_edit,如下所示 ObserveEvent

mt <- mtcars %>%
  select(mpg, cyl) %>%
  head()

ui <- fluidPage(
  
  DTOutput(outputId = "final_tbl")
)

server <- function(input, output){
  df1 <- reactiveValues(data=NULL)
  dat <- reactive({
    d <- mt %>%
      mutate(total = mpg + cyl)
    d
  })
  
  observe({
    df1$data <- dat()
  })
  
  output$final_tbl <- renderDT({
    
    df1$data %>%
      datatable(editable = TRUE)
    
  })
  
  observeEvent(input$final_tbl_cell_edit, {
    info = input$final_tbl_cell_edit
    str(info)
    i = info$row
    j = info$col
    v = info$value
    
    # Without this line the table does not change but with it it jumps to row 1 after an edit.
    df1$data[i, j] <<- (DT::coerceValue(v, df1$data[i, j]))
    df1$data[,"total"] <<- df1$data[,"mpg"] + df1$data[,"cyl"]  ## update the total column
  })

}

shinyApp(ui, server)