'How to save input to data frame, and use it later in Shiny?

I want to save the value from username input if it doesn't exist in data frame, and render text if it already exists (for reprex purpose).

Rendering text part works perfectly, but I don't know how to save it and use it later. I want to save the value permanently, not only on current session

I've got this error:
Warning: Error in <-: invalid (NULL) left side of assignment

library(shiny)

ui <- fluidPage(
  textInput("username", "username"),
  actionButton("save", "Save!"),
  textOutput("confirmation")
)

server <- function(input, output, session) {
  
  df <- reactive(data.frame(column1 = "user1"))
  
  exist <- reactive(input$username %in% df()$column1)
  
  observeEvent(input$save, {
    if (exist() == TRUE) {
      output$confirmation <- renderText("Username already exists!")
    } else {
      df() <- rbind(df(), input$username) # <-- THIS dosn't work
    }
  })
}

shinyApp(ui, server)

EDIT: Thanks to @I_O answer, I figured out this solution
reactiveVal() keep the changes in current session.
write_csv() and read_csv() part, allows app to use previously saved usernames.

saved_df <- read_csv("C:\\Users\\Przemo\\Documents\\R\\leaRn\\Shiny\\Moodtracker\\testers\\test_safe.csv")

ui <- fluidPage(
  textInput("username", "username"),
  actionButton("save", "Save!"),
  textOutput("confirmation")
)

server <- function(input, output, session) {
  
  df <- reactiveVal(saved_df)
  
  exist <- reactive(input$username %in% df()$column1)
  
  observeEvent(input$save, {
    if (exist() == TRUE) {
      output$confirmation <- renderText("Username already exists!")
    } else {
      output$confirmation <- renderText("")
      df(rbind(df(), input$username))
      write_csv(df(), "C:\\Users\\Przemo\\Documents\\R\\leaRn\\Shiny\\Moodtracker\\testers\\test_safe.csv")
    }
  })
}

shinyApp(ui, server)


Sources

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

Source: Stack Overflow

Solution Source