У меня утечка памяти в моей блестящей программе, и я изо всех сил пытаюсь это выяснить. У меня очень небольшая утечка кода, который я покажу, но для моего реального кода он намного больше потерь, накапливая гигабайты в днях. Я работал над упрощением этого, но все еще показываю проблему, и это лучшее, что я мог придумать. Для сброса страницы я использую три пакета - глянцевый, блестящий, а для потери памяти - pryr.
По сути, просто введите числа и нажмите кнопку отправки, чтобы сбросить / распечатать память. Если среднее значение первых двух чисел превышает 5, создается второе поле. Если среднее значение ниже 5 в любом поле, но не 0, то вы можете отправить и сбросить.
#Library Load##########################################################################################
lapply(c("shiny","shinyjs","pryr"),require,character.only = T)
#ui, shiny body#########################################################################################
ui<-fluidPage(
useShinyjs(),
#Div to reset the whole page upon submission
div(id = paste0("BOX_"),
h3("Add random numbers. If average is above 5, an additional box will be added. If below 5, click reset to reset the page and update memory"),
#lapply - Add 2 boxes with double numeric inputs and average
column(width = 5, align = "center",
lapply(seq(1,3,2),function(y){
div(id = paste0("Box_ID_","_",y),
numericInput(paste0("Number_",y), label = paste0("Number - ",y), value = 0, min = 0, max = 60, step = .1),
numericInput(paste0("Number_",y+1), label = paste0("Number - ",y+1), value = 0, min = 0, max = 60, step = .1),
h3(textOutput(paste0("Avg_",y))))
})),
column(width = 1),
#Submit and memory used#########
actionButton(paste0("Complete_"),"Reset"),
br(),
h4("Memory output - Updates on submit"),
textOutput(paste0("Memory"))
))
#######Server################
server <- function(input, output, session) {
#Reactive Average#########
Avg<-reactive({
lapply(seq(1,3,2),function(y){
req(input[[paste0("Number_",y)]],input[[paste0("Number_",y+1)]])
if(input[[paste0("Number_",y)]] == 0 | input[[paste0("Number_",y+1)]] == 0) {0} else {
(input[[paste0("Number_",y)]]+input[[paste0("Number_",y+1)]])/2}
})
})
#Average Output##########
lapply(seq(1,3,2),function(y){
output[[paste0('Avg_',y)]] <- renderText({
req(input[[paste0("Number_",y)]],input[[paste0("Number_",y+1)]])
if(input[[paste0("Number_",y)]] == 0 | input[[paste0("Number_",y+1)]] == 0) {
"Enter both numbers"} else{
paste0("Average = ",round(Avg()[[(y/2)+.5]],1))}
})
})
# Enable/Disable Submit button if average is not 0, and below 5
observe({
lapply(seq(1,3,2),function(y){
req(input[[paste0("Number_",y)]], input[[paste0("Number_",y+1)]])
if(Avg()[[1]] > 0 & Avg()[[1]] <= 5 | Avg()[[2]] > 0 & Avg()[[2]] <= 5 ) {
shinyjs::enable(paste0("Complete_"))} else{shinyjs::disable(paste0("Complete_"))}
})
})
#Show next average box if average is not below 5
observe({
lapply(seq(1,3,2),function(y){
req(input[[paste0("Number_",y)]],input[[paste0("Number_",y+1)]])
if(y == 1 & Avg()[[(y/2)+.5]] <= 5) {
shinyjs::show(paste0("Box_ID_","_",1))
shinyjs::hide(paste0("Box_ID_","_",3))
} else if(y == 1 & Avg()[[(y/2)+.5]] > 5) {
shinyjs::show(paste0("Box_ID_","_",1))
shinyjs::show(paste0("Box_ID_","_",3))
} else if(Avg()[[(y/2)+.5]] > 5) {
shinyjs::show(paste0("Box_ID_","_",y+2))
} else {shinyjs::hide(paste0("Box_ID_","_",y+2))}
})
})
#Submit Button - Reset boxes, print memory######
observeEvent(input[[paste0("Complete_")]],{
#Reset the page
reset(paste0("BOX_"))
#Garabage collect
})
#Memory used############
observeEvent(input[[paste0("Complete_")]],{
output[[paste0("Memory")]]<-renderText({
paste0(round(mem_used()/1000000,3)," mb")
})
})
}
# Run App
shinyApp(ui, server)
Мое лучшее предположение, что утечка произошла из событий наблюдения / наблюдения. Я попробовал журнал реакции, описанный здесь: https://github.com/rstudio/shiny/issues/1591 Но я не совсем понимаю, в чем проблема. Я также изучил это, но я не использую какие-либо выходные данные в наблюдении: https://github.com/rstudio/shiny/issues/1551 Я писал ранее, спрашивая идеи о том, как найти утечки памяти: R Блестящая утечка памяти - Предложения о том, как найти ? Исходя из этого, я все еще немного изучаю модули, чтобы посмотреть, поможет ли это.
Спасибо за любую помощь.