Search code examples
rshinyshiny-serverrstudio-server

updateinputs function package


I wanted to create a shiny app that gets data from user and saves it in .csv formats. But each time the user enters the data past data is not removed so when appending all the previous data(not necessarily for same user) gets appended with the new data that has been entered. I wanted to create a new "new" button which deletes past input data and gives a new table for input.

library(shiny)
    ui <- fluidPage(
       titlePanel("Creating a database"),
       sidebarLayout(
          sidebarPanel(
            textInput("name", "Company Name"),
            textInput("income", "Income"),
            textInput("expenditure", "Expenditure"),
            dateInput("date", h3("Date input"),value = Sys.Date() ,min = "0000-01-01",
                      max = Sys.Date(), format = "dd/mm/yy"),
            actionButton("Action", "Submit"),#Submit Button
            actionButton("new", "New")),
            mainPanel(
            tableOutput("table"),   #Table showing what is there in the data frame
            textInput("filename", "Enter Filename for download"),   #filename
            helpText(strong("Warning: Append if want to update existing data.")),
            downloadButton('downloadData', 'Download'), #Button to save the file
            downloadButton('Appenddata', 'Append') #Button to update a file
          )
    )
    )
    # Define server logic
    server <- function(input, output){
      #Global variable to save the data
      Data <- data.frame()

      Results <- reactive(data.frame(input$name, input$income, input$expenditure,
                                     as.character(input$date),
                                     as.character(Sys.Date())))

      #To append the row and display in the table when the submit button is clicked
      observeEvent(input$Action,{
        #Append the row in the dataframe
        Data <<- rbind(Data,Results())
        #Display the output in the table
        output$table <- renderTable(Data)
      })
      observeEvent(input$new, {
        UpdateInputs(CreateDefaultRecord(), session)
      })
      output$downloadData <- downloadHandler(

        # Create the download file name
        filename = function() {
          paste(input$filename , ".csv", sep="")
        },
        content = function(file) {

          write.csv(Data, file,row.names = FALSE) # put Data() into the download file
        })
      output$Appenddata <- downloadHandler(

        # Append data
        filename = function() {
          paste(input$filename, ".csv", sep="")
        },
        content = function(file) {
          write.table( Data, file=file.choose(),append = T, sep=',',
                       row.names = FALSE, col.names = FALSE)
        })
    }`enter code here`

    # Run the application 
    shinyApp(ui = ui, server = server)

The code works perfectly and i can enter new data as and when i want fine but when i press the "new" button so as to clear the data so that i want to enter new set of details the app closes down giving the following error

Warning: Error in UpdateInputs: could not find function "UpdateInputs"

The warning does not close the app until the new button is pressed. What is it that i am missing? Please help. Thank You.


Solution

  • If you just want to clear the data you could substitute

    observeEvent(input$new, {
            UpdateInputs(CreateDefaultRecord(), session)
          })
    

    with

    observeEvent(input$new, {
        #Append the row in the dataframe
        Data <<- NULL
        #Display the output in the table
        output$table <- renderTable(Data)
      })
    

    although I'm not sure why you are saving Data globally using <<- and this method would obviously clear it.