'How I should create a "clear" button for eliminating rows in R shiny?

I am referring to my previous post: while updating the datatable in R shiny, how to make column inputs necessary fields using "validate" and "need" in R shiny

I'm making a R shiny app in which the user can add numerous rows by clicking the "Add" button and saving the data to a .xpt file. As of now, everything is in working order.

I just stuck below:

However, in order to expand this app, I've added the button "clear" to the server function, as well as'reactiveValues', so that when users click it, all previous rows (added rows) are removed (cleared), and the app is ready to accept new rows. I can still add rows, but the clear option doesn't work and doesn't give me any errors. Is there anyone who can assist me?

code

library(shiny)
library(stringr)
library(shinydashboard)
library(tidyverse)
library(DT)
library("SASxport")

ui <- fluidPage(
  fluidRow(tabsetPanel(id='tabs', 
                       tabPanel("Tab1",
                                div(id = "form", 
                                    textInput("schoolId", label="SchoolId *" ),
                                    selectInput("userId", label="UserId", choices = c("UserA", "UserB", "UserC"),selected = "UserA"), 
                                    textInput("class", label = "class"), 
                                    selectInput("result", label="result", choices = c("PASS", "FAIL" )),
                                    #dateInput("resultdate", value = NA, label = "Date of the result / Remarks for fail"
                                              #, format = "yyyy-mm-dd" )
                                ),
                                actionButton("add", "Add"),
                                actionButton("clear", "Clear")
                       ), 
                       tabPanel("Tab2", 
                                tabPanel("View", 
                                         conditionalPanel("input.add != 0", 
                                                          DTOutput("DT2"), hr(), downloadButton('downloadData', 'Download'))
                                )
                       )
  )
  )
)

server <- function(input, output, session) {
  store <- reactiveValues()
  
  observeEvent(input$add,{
    new_entry <- data.frame(SCHOOLID=input$schoolId, USERID=input$userId
                            , CLASS= input$class
                            , RESULT=input$result
                            )
   # new_entry <- data.frame(SCHOOLID=input$schoolId, USERID=input$userId
                           # , CLASS= input$class
                            #, RESULT=input$result,
                            #RESULT_DATE = input$resultdate)
    
    if("value" %in% names(store)){
      store$value<-bind_rows(store$value, new_entry)
    } else {
      store$value<-new_entry
    }
    # If you want to reset the field values after each entry use the following two lines
    for(textInputId in c("schoolId", "class")) updateTextInput(session, textInputId, value = "")
    updateSelectInput(session, "userId", selected = "UserA")
    updateSelectInput(session, "result", selected = "PASS")
    # updateDateInput(session, "resultdate")
  })
  output$DT2 <- renderDT({
    store$value
  })
  

  
  output$downloadData <- downloadHandler(
    filename = paste0("mydata", ".xpt"),
    content = function(file){
      write.xport(store$value, file = file)
    }
  )
  new_frame <- reactive({
    store$value
  })
  
  #function allows to clear the rows
  values <- reactiveValues(df_data = new_frame)
  
  observeEvent(input$clear,{
    
    if (!is.null(input$table1_rows_selected)) {
      
      values$df_data <- values$df_data[-as.character(input$table1_rows_selected),]
    }
  })
  
  output$Tab2 <- renderDataTable({
    values$df_data
  })
  
}

shinyApp(ui, server)


Solution 1:[1]

The problem here is a slight oversight in how the selected rows are obtained for deletion. Instead of getting selected rows from the DT table, one has to get them straight from the ui element which is DT2

Also, you can work directly on the DT table created in server, instead of storing a new reactive value

Here's the revised (relevant) server code :

  #xxxxxxxx this   not needed 
  #values <- reactiveValues(df_data = new_frame)
  
  observeEvent(input$clear,{
   
    if (!length(input$DT2_rows_selected)==0) {
  #work directly on store variable      
      store$value<- store$value[-as.numeric(input$DT2_rows_selected),]
    }       
    
    
  })

I've tested this and it works. Can post the whole app code if needed.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 R.S.