如何从闪亮的reactiveValues中删除元素?

G.D*_*.D. 7 r shiny shiny-server

如何从reactiveValues()中删除元素

例如,当我运行代码时:

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) )
  }))
Run Code Online (Sandbox Code Playgroud)

输出是:

$ val1 NULL $ val2 [1] 2 $ val3 [1] 3

代替:

$ val2 [1] 2 $ val3 [1] 3

谢谢!

小智 3

我会尝试解决这个问题:

我想从reactiveValues对象中删除元素,因为我使用它来存储用户定义的列表对象,这些对象单独可能非常大。我担心的是,如果用户在单个会话中创建太多此类对象,则会导致应用程序因内存不足而崩溃。

当您将 NULL 分配给值 R 时,将从内存中删除该元素。请参阅下面的应用程序 - 当您单击delete按钮时,内存将被释放:

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)
    })
  }))
Run Code Online (Sandbox Code Playgroud)

下面的两张图片显示了单击 之前的状态delete,以及之后 -> 请注意,R 使用的值已更改。

缺失的 80mb 是向量的大小val1

pryr::object_size(rnorm(1e7))
# 80 MB
Run Code Online (Sandbox Code Playgroud)

点击之前 点击后