Устранение утечки памяти - Shiny R - PullRequest
0 голосов
/ 26 октября 2018

У меня утечка памяти в моей блестящей программе, и я изо всех сил пытаюсь это выяснить. У меня очень небольшая утечка кода, который я покажу, но для моего реального кода он намного больше потерь, накапливая гигабайты в днях. Я работал над упрощением этого, но все еще показываю проблему, и это лучшее, что я мог придумать. Для сброса страницы я использую три пакета - глянцевый, блестящий, а для потери памяти - 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 Блестящая утечка памяти - Предложения о том, как найти ? Исходя из этого, я все еще немного изучаю модули, чтобы посмотреть, поможет ли это.

Спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...