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)