【问题标题】:Issues while adding and deleting row in R shiny datatable在 R 闪亮数据表中添加和删除行时出现问题
【发布时间】:2020-03-07 08:31:48
【问题描述】:

我正在尝试在 r shiny 中添加一个可编辑的数据表。我有两个组件。首先是允许用户添加新行并删除选定行。其次,当用户更改单元格中的任何值时,它应该更新相应的单元格。我首先面临的问题是无法删除选定的行。我可以添加这些但不能删除。下面是我正在使用的代码。另外我正在尝试重置为默认表,但它不会重置为默认表。我怎样才能解决这个问题。谢谢。

### Libraries
library(shiny)
library(dplyr)
library(DT)

### Data
input_data <- data.frame(aa = c("Brand1", "Brand2","Brand3"),
                         bb = c(2000, 3000, 4000),
                         cc = c (.5, .5, .5),
                         dd = c(2000, 3000, 4000),
                         ee = c (.5, .5, .5),
                         ff = c (.5, .5, .5),
                         gg = c (.5, .5, .5),
                         stringsAsFactors = FALSE)

### Shiny App
shinyApp(
  ui = basicPage(
    mainPanel(

      actionButton("reset", "Reset"),
      actionButton("add_btn", "Add"),
      actionButton("delete_btn", "Delete"),
      tags$hr(),
      DT::dataTableOutput("mod_table")    )
  ),
  server = function(input, output) {

    #demodata<-input_data

    this_table <- reactiveVal(input_data)

    observeEvent(input$add_btn, {
      t = rbind(data.frame(aa = "default",
                           bb = 1000000,cc = 2.0,dd = 20000, ee = 40,ff = 00 , gg = 00), 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)
    })
observeEvent(input$reset, {
       this_table <- input_data # your default data
     })

    output$mod_table <- DT::renderDataTable({
      datatable(this_table(), selection = 'single',editable = TRUE, options = list(dom = 't'))

    })
    }
)

【问题讨论】:

  • 这个答案对你有用吗?

标签: r shiny dt


【解决方案1】:

删除行:

您使用input$tableId_rows_selected 获得选定的行。您的tableIdmod_table

因此,如果您将 input$shiny_table_rows_selected 更改为 input$mod_table_rows_selected,它将起作用。

重置表格:

如果您从分配给this_table 切换到使用this_table() 作为“设置函数”,它将起作用。我认为这只是一个小错字,因为您已经正确地将这种语法用于“删除部分”:

observeEvent(input$reset, {
  this_table(input_data)
})

可重现的代码:

library(shiny)
library(dplyr)
library(DT)

### Data
input_data <- data.frame(aa = c("Brand1", "Brand2","Brand3"),
                         bb = c(2000, 3000, 4000),
                         cc = c (.5, .5, .5),
                         dd = c(2000, 3000, 4000),
                         ee = c (.5, .5, .5),
                         ff = c (.5, .5, .5),
                         gg = c (.5, .5, .5),
                         stringsAsFactors = FALSE)

### Shiny App
shinyApp(
  ui = basicPage(
    mainPanel(

      actionButton("reset", "Reset"),
      actionButton("add_btn", "Add"),
      actionButton("delete_btn", "Delete"),
      tags$hr(),
      DT::dataTableOutput("mod_table")    )
  ),
  server = function(input, output) {

    #demodata<-input_data

    this_table <- reactiveVal(input_data)

    observeEvent(input$add_btn, {
      t = rbind(data.frame(aa = "default", bb = 1000000,cc = 2.0, dd = 20000, 
                           ee = 40,ff = 00 , gg = 00), this_table())
      this_table(t)
    })

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

    observeEvent(input$reset, {
      this_table(input_data)
    })

    output$mod_table <- DT::renderDataTable({
      datatable(this_table(), selection = 'single',editable = TRUE, 
                options = list(dom = 't'))
    })
  }
)

【讨论】:

    【解决方案2】:

    JavaScript 解决方案:

    library(shiny)
    library(DT)
    
    ### Data
    input_data <- data.frame(aa = c("Brand1", "Brand2","Brand3"),
                             bb = c(2000, 3000, 4000),
                             cc = c (.5, .5, .5),
                             dd = c(2000, 3000, 4000),
                             ee = c (.5, .5, .5),
                             ff = c (.5, .5, .5),
                             gg = c (.5, .5, .5),
                             stringsAsFactors = FALSE)
    
    ### Callback
    callback <- c(
      '$("#add_btn").on("click", function(){',
      '  var newrow = ["default", 1000000, 2, 20000, 40, 0, 0];',
      '  table.row.add(newrow).draw();',
      '});',
      '$("#delete_btn").on("click", function(){',
      '  var rows = table.rows(".selected");',
      '  rows.remove().draw();',
      '});'
    )
    
    ### Shiny App
    shinyApp(
      ui = basicPage(
        mainPanel(
          br(),
          actionButton("reset", "Reset"),
          actionButton("add_btn", "Add"),
          actionButton("delete_btn", "Delete"),
          tags$hr(),
          DTOutput("mod_table")
        )
      ),
    
      server = function(input, output) {
    
        output$mod_table <- renderDT({
          input$reset
          datatable(input_data, selection = 'single', editable = TRUE, 
                    rownames = FALSE, 
                    options = list(dom = 't'), callback = JS(callback))
        }, server = FALSE)
    
      }
    )
    

    【讨论】:

      猜你喜欢
      • 2016-01-28
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 2021-03-15
      相关资源
      最近更新 更多