如何从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
谢谢!
答案 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
答案 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)
})
}))