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

时间:2016-12-20 15:36:49

标签: 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) )
  }))

输出结果为:

  

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

而不是:

  

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

谢谢!

2 个答案:

答案 0 :(得分:0)

我将尝试添加此地址

  

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

当您为值R分配NULL时,将从内存中删除该元素。请参阅下面的应用-单击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)
    })
  }))

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

丢失的80mb就是val1向量的大小。

pryr::object_size(rnorm(1e7))
# 80 MB

Before click After click

答案 1 :(得分:0)

如果您仍想使用对NULL的赋值来删除值,则可以将反应值赋值为列表。请参阅以下内容,对Zygmunt Zawadzki的答案进行简单修改。然后以通常的R方式对列表进行操作,以反映数据中的更改。

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)
    })
  }))