Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R闪亮内存泄漏-如何查找的建议?_R_Memory Leaks_Shiny - Fatal编程技术网

R闪亮内存泄漏-如何查找的建议?

R闪亮内存泄漏-如何查找的建议?,r,memory-leaks,shiny,R,Memory Leaks,Shiny,我正在寻找关于如何在一个闪亮的R程序中识别内存泄漏的一般想法。我正在努力确定泄漏的确切来源,因此很难重新创建,我的代码已经超过1000行。我确信它与观察和观察事件有关,但我不能准确地指出它。实际上,我很喜欢bborgeser在这里提出的想法,使用选项reactlog:但是当我尝试这样做时,showReactLog()不会加载。我猜我的代码太大了 所以我的主要问题是,识别内存泄漏的最佳方法是什么?我正在使用pryr包跟踪每次提交后使用的内存。所以我可以看出记忆在增加。我找到了一些关于内存泄漏的其他

我正在寻找关于如何在一个闪亮的R程序中识别内存泄漏的一般想法。我正在努力确定泄漏的确切来源,因此很难重新创建,我的代码已经超过1000行。我确信它与观察和观察事件有关,但我不能准确地指出它。实际上,我很喜欢bborgeser在这里提出的想法,使用选项reactlog:但是当我尝试这样做时,showReactLog()不会加载。我猜我的代码太大了

所以我的主要问题是,识别内存泄漏的最佳方法是什么?我正在使用pryr包跟踪每次提交后使用的内存。所以我可以看出记忆在增加。我找到了一些关于内存泄漏的其他文章,但它们更多地是关于要解决的特定问题,而不是一般性问题:

因为有些人在看到一些实际代码时工作得更好,所以我尽力更简洁地重新创建它。这将使其每小时增加大约.3MB。也许这与使用一个又一个列表有关?我已经玩弄我的东西好几个星期了,没有取得任何进展

具体地说,在这段代码中,我知道内存泄漏肯定是在反应/观察中。如果我阻止这些,内存就不会增加。但我相信你能在不增加记忆的情况下使用反应和观察。因此,这让我回到了我最初的问题,在本例中,我通过缓慢地屏蔽部分找到了它,但即使在我的较大代码上尝试,我也无法真正识别它来自哪个部分。那么人们是如何找到他们的漏洞的呢

    #Library Load##########################################################################################
lapply(c("shiny","tidyverse","shinydashboard","shinyjs","pryr"),require,character.only = T)
#ui, shiny body#########################################################################################
body<-dashboardBody(
  useShinyjs(),
            ({
              tabs<-lapply(1:length(1:8), function(x){
                tabPanel(box(title = paste0('Tab ',x),  width = NULL),
                fluidPage(
                  div(id = paste0("BOX_",x),
                      column(width = 6, align = "center",
                          lapply(seq(1,15,2),function(y){
                              div(id = paste0("Box_ID_",x,"_",y),
                                  box(width = NULL, title = paste0("Reading",((y/2)+.5)),
                                      column(width = 4,
                                             numericInput(paste0("Number_",x,"_",y), label = paste0("Number - ",y), value = 0, min = 0, max = 60, step = .1)),
                                      column(width = 4,
                                             numericInput(paste0("Number_",x,"_",y+1), label = paste0("Number - ",y+1), value = 0, min = 0, max = 60, step = .1))))
                          })),
                      column(width = 2, align = "center",
                                 actionButton(paste0("Complete_",x),"Complete"))
                  )))
              }) 
              do.call(tabBox, c(tabs, list(width = NULL)))
            }))
##UI combination###################
ui<-dashboardPage(
  dashboardHeader(disable = T),
  dashboardSidebar(disable = T),
  body)
#######Server################
server <- function(input, output, session) {
  #Tab 1 - Reactive Average
  Avg<-reactive({
    lapply(1:8, function(x) {
      lapply(seq(1,15,2),function(y){
        req(input[[paste0("Number_",x,"_",y)]],input[[paste0("Number_",x,"_",y+1)]])
        if(input[[paste0("Number_",x,"_",y)]] == 0 | input[[paste0("Number_",x,"_",y+1)]] == 0) {0} else {
          (input[[paste0("Number_",x,"_",y)]]+input[[paste0("Number_",x,"_",y+1)]])/2}
      })
    })
  })

  #Tab 1 - Show or hide boxes
  lapply(1:8, function(x) {
    lapply(seq(1,15,2),function(y){
      observe({
        req(input[[paste0("Number_",x,"_",y)]],input[[paste0("Number_",x,"_",y+1)]])
        if(y == 1 & Avg()[[x]][[(y/2)+.5]] <= 30) {
          shinyjs::show(paste0("Box_ID_",x,"_",1))
          shinyjs::hide(paste0("Box_ID_",x,"_",3))
        } else if(y == 1 & Avg()[[x]][[(y/2)+.5]] > 30) {
          shinyjs::show(paste0("Box_ID_",x,"_",1))
          shinyjs::show(paste0("Box_ID_",x,"_",3))
        } else if(Avg()[[x]][[(y/2)+.5]] > 30) {
          shinyjs::show(paste0("Box_ID_",x,"_",y+2))
        } else {shinyjs::hide(paste0("Box_ID_",x,"_",y+2))}
      })
    })
  })

  #Tab 1 - Submit Button - Reset boxes, create data frame and append to file. 
  lapply(1:8,function(x){
    observeEvent(input[[paste0("Complete_",x)]],{
     #Reset the page
      reset(paste0("BOX_",x))
      #Garabage collect
      gc()
      #Print memory used. Tracking memory leaks
      print(mem_used())
    })
  })
}
shinyApp(ui, server)
#库加载##########################################################################################
lapply(c(“闪亮”、“整洁”、“shinydashboard”、“shinyjs”、“pryr”),需要,字符.only=T)
#ui,闪亮的身体#########################################################################################

身体侧想:你考虑过使用吗?乍一看,它似乎可以减少代码(如果不是您的问题的话)并提高可读性。这是我第一次听说闪亮的模块,所以感谢您的建议。我将研究它,介绍已经让我认为它将至少使这更容易重申可能稍微超过陈述他们,但我认为“闪亮的模块”是“功能性的闪亮编程”的“元函数”。他们需要一点实践才能真正摸索,我强烈建议进行一些动手实践(并寻找教程/走查)。不确定,但可能类似于
profvis
lib可以帮助做到这一点,理想情况下,你应该做很多内部观察,因为有些对象没有发布。