Удалить последнюю строку таблицы данных - PullRequest
0 голосов
/ 06 октября 2019

У меня есть код, который добавляет данные в таблицу данных. Я хочу, чтобы логика удаляла последний ряд DT, когда я нажимал кнопку удаления. Я пробовал различные логики, но не работает. Может ли кто-нибудь помочь

    library(shiny)
    library(shinyjs)

    fields <- c("fy","quarter","month", "due_date","actual_date")

###########################################
    ui <- fluidPage(

  # Application title
     titlePanel("MCA Data Entry"),

  # Sidebar with reactive inputs
       sidebarLayout(
         sidebarPanel(
          textInput("fy","Financial Year"),
          selectInput("quarter","Quarter",c("Q1","Q2","Q3","Q4")),
          dateInput("month","Month of Account", format="MM, yyyy"),
          dateInput("due_date", "Due date for submission", format="dd-mm-yyyy"),
          dateInput("actual_date","Actual date of submission",format="dd-mm-yyyy"),
          actionButton("save","Add"),
          actionButton("reset","Delete")

         ),

    # a table of reactive outputs
         mainPanel(
         mainPanel(

          DT::dataTableOutput("responses", width = 600), tags$hr()

          )
          )
          )
           )
      server <- function(input, output,session) {

  #create a data frame called responses
      saveData <- function(data) {
        data <- data.frame(
         fy=data["fy"],
         quarter=data["quarter"],
         month=as.Date(as.numeric(data[["month"]]),"1970-01-01"),
         due_date=as.Date(as.numeric(data[["due_date"]]),"1970-01-01"),
         actual_date=as.Date(as.numeric(data[["actual_date"]]),"1970-01-01")
         )
         if (exists("responses")) {
          responses <<- rbind(responses, data)
          } else {
      responses <<- data
    }
  }

  loadData <- function() {
    if (exists("responses")) {
      responses
    }
  }


  # Whenever a field is filled, aggregate all form data
  #formData is a reactive function
  formData <- reactive({
    data <- sapply(fields, function(x) input[[x]])
    data
    print(data)
  })

  # When the Save button is clicked, save the form data
  observeEvent(input$save, {
    saveData(formData())
  },priority=1)

  # Show the previous responses
  # (update with current response when save is clicked)
  output$responses <- DT::renderDataTable({
    input$save
    datatable(loadData(),rownames=FALSE,options = list(sDom  = '<"top"><"bottom">'))
  })     
}
shinyApp(ui,server)

Я хочу удалить последнюю строку, когда я нажимаю кнопку удаления, или, если это невозможно, удалить всю таблицу и начать заново. Я пробовал различные логики, эти логики могли удалять данные, а не строку как таковую. Пустые строки остаются после удаления через мою логику.

1 Ответ

0 голосов
/ 07 октября 2019

Вот способ с кнопкой, встроенной в таблицу данных:

library(DT)

datatable(iris[1:5,],
          extensions = 'Buttons',
          options = list(
            dom = 'Bfrtip',
            buttons = list(
              list(
                extend = "collection",
                text = 'Delete last row',
                action = DT::JS(c(
                  "function ( e, dt, node, config ) {",
                  "  var lastRow = dt.rows().count();",
                  "  dt.row(lastRow-1).remove().draw();",
                  "}"))
                )
              )
            )
          )

enter image description here


РЕДАКТИРОВАТЬ

ИВот способ с блестящей кнопкой:

library(DT)
library(shiny)

ui <- fluidPage(
  actionButton("delete", "Delete last row"),
  br(),
  DTOutput("tbl")
)

server <- function(input, output){
  output[["tbl"]] <- renderDT({
    datatable(iris[1:5,],
              callback = JS(c(
                "$('#delete').on('click', function(){",
                "  var lastRow = table.rows().count();",
                "  table.row(lastRow-1).remove().draw();",
                "});"
              ))
    )    
  }, server = FALSE)
}

shinyApp(ui, server)
...