How to delete element from reactiveValues()
For example, when I run the code:
library(shiny)
runApp(list(
  ui=tableOutput("table1"),
  server=function(input, output, session) {
    values <- reactiveValues(val1 = 1, val2 =2, val3 = 3)
    values$val1 <- NULL
    output$table1 <- renderPrint(reactiveValuesToList( values) )
  }))
The output is:
$val1 NULL $val2 [1] 2 $val3 [1] 3
Instead of:
$val2 [1] 2 $val3 [1] 3
Thank you!
If you still want to use the assignment to NULL to remove values, you can assign the reactive value to be a list. See below for a simple modification to Zygmunt Zawadzki's answer. Then operate on the list in the usual R way to reflect the changes in your data.
library(shiny)
ui <- fluidPage(
    mainPanel(
      actionButton("delete", "delete"),
      verbatimTextOutput("table1")
    )
  )
)
runApp(list(
  ui=ui,
  server=function(input, output, session) {
    values <- reactiveValues(data=list(val1 = rnorm(1e7), val2 =2, val3 = 3))
    observeEvent(input$delete,{
      values$data$val1 <- NULL
    })
    output$table1 <- renderPrint({
      res <- capture.output(gc())
      cat(res, sep = "\n")
      # No reactiveValuesToList needed
      # x <- reactiveValuesToList(values)
      length(values$data)
    })
  }))
                        I'll try to addres this:
I would like to delete elements from a reactiveValues object because I am using it to store user-defined list objects that can be quite large individually. My concern is that if the user creates too many such objects in a single session it will cause the app to crash due to insufficient memory.
When you assign NULL to the value R will remove the element from memory. See the app below - when you click delete button the memory is released:
library(shiny)
ui <- fluidPage(
    mainPanel(
      actionButton("delete", "delete"),
      verbatimTextOutput("table1")
    )
  )
)
runApp(list(
  ui=ui,
  server=function(input, output, session) {
    values <- reactiveValues(val1 = rnorm(1e7), val2 =2, val3 = 3)
    observeEvent(input$delete,{
      values$val1 <- NULL
    })
    output$table1 <- renderPrint({
      res <- capture.output(gc())
      cat(res, sep = "\n")
      x <- reactiveValuesToList(values)
      length(x)
    })
  }))
The two images below show you the state before clicking the delete, and after -> note that the value used by R has changed.
Those missing 80mb is the size of the val1 vector.
pryr::object_size(rnorm(1e7))
# 80 MB

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With