结合可编辑的DT和“添加行”功能

时间:2019-08-20 21:23:05

标签: r shiny datatables

我正在尝试满足两个特定需求:
-用户需要能够向DataTable添加一行
-数据表需要可编辑

当前,我已经设置了“添加行”功能以及可编辑功能,但是编辑不能持久化表排序或添加新行。

运行以下代码时,请注意如何添加/删除行,但是在编辑字段然后添加/删除行时,您将丢失编辑。

我希望有人可以帮助我结合这两个要求!感谢帮助。

this_table = data.frame(bins = c(30, 50), cb = c(T, F))
ui <- fluidPage(

  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30),
      checkboxInput("cb", "T/F"),
      actionButton("add_btn", "Add"),
      actionButton("delete_btn", "Delete")
    ),

    mainPanel(
      DTOutput("shiny_table")
    )
  )
)

server <- function(input, output) {

  this_table <- reactiveVal(this_table)

  observeEvent(input$add_btn, {
    t = rbind(data.frame(bins = input$bins,
                         cb = input$cb), this_table())
    this_table(t)
  })

  observeEvent(input$delete_btn, {
    t = this_table()
    print(nrow(t))
    if (!is.null(input$shiny_table_rows_selected)) {
      t <- t[-as.numeric(input$shiny_table_rows_selected),]
    }
    this_table(t)
  })

  output$shiny_table <- renderDT({
    datatable(this_table(), selection = 'single', options = list(dom = 't'), editable = T)
  })
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

在编辑后,您将需要使用observeEvent来更新表数据。您可以从input$shiny_table_cell_edit中提取相关的表行,列和新编辑的值。尝试将以下代码添加到您的服务器功能中:

observeEvent(input$shiny_table_cell_edit, {
    info <- input$shiny_table_cell_edit
    edit_row <-  info$row
    edit_col <-  info$col   
    edit_value <-  info$value

    t = this_table()
    t[edit_row,edit_col] <- edit_value
    this_table(t)
})