使用闪亮时的临时文件

J0ki

我正在开发一个闪亮的应用程序,用户可以在该应用程序中上传文件并选择X参数,然后按下按钮,它会生成5个图(ggplot2和barplot)以及动态数据表(DT)。另外,我想将闪亮的应用程序放入Linux服务器。

我正在使用tempfiles()每个文件来创建绘图以及DT。

之后,我的问题是:

当用户关闭闪亮的应用程序(关闭窗口)时,tempfiles是否会自动删除?

如果没有,我该怎么做删除临时文件?

我的尝试:

session$onSessionEnded(function() {
  if (!is.null(x1)) {
    file.remove(x1)
  }
  if (!is.null(x2)) {
    file.remove(x2)
  }
  if (!is.null(x3)) {
    file.remove(x3)
  }
  if (!is.null(x4)) {
    file.remove(x4)
  }
  if (!is.null(xx)) {
    file.remove(xx)
  }
})

要么:

session$onSessionEnded(function() {
  files <- list.files(tempdir(), full.names = T, pattern = "^file")
  file.remove(files)
})

使用该代码,当用户按下按钮一次时,我将删除临时文件;如果用户按下按钮超过1次,则该窗口将关闭,并且它将仅删除最后生成的文件。第二部分删除temp目录下的所有文件,但这会影响其他用户?(我认为是的,所以这就是为什么我需要另一个解决方案)。

ggplot和barplot生成的.png临时文件不会自动删除。

我担心的是,如果临时文件不会自动删除,并且linux服务器将由于大量的临时文件而崩溃。

希望你能解决我的疑问。阿特·琼(Att Joan)。

幻影

deleteFile=TRUE如果要让render函数自动删除临时文件,可以使用参数

shinyServer(function(input, output, clientData) {
  output$myImage <- renderImage({
    # A temp file to save the output.
    # This file will be removed later by renderImage
    outfile <- tempfile(fileext='.png')

    # Generate the PNG
    png(outfile, width=400, height=300)
    hist(rnorm(input$obs), main="Generated in renderImage()")
    dev.off()

    # Return a list containing the filename
    list(src = outfile,
         contentType = 'image/png',
         width = 400,
         height = 300,
         alt = "This is alternate text")
      }, deleteFile = TRUE)
    })

将创建一个临时文件以保存输出,然后由于该deleteFile=TRUE参数而自动删除该文件

默认的Shiny(shiny.R)还具有内置机制,可以在您担心的情况下清除文件上传目录会话结束时,以下代码删除上传目录:

registerSessionEndCallbacks = function() {
      # This is to be called from the initialization. It registers functions
      # that are called when a session ends.

      # Clear file upload directories, if present
      self$onSessionEnded(private$fileUploadContext$rmUploadDirs)
    }

关于手动删除临时文件的另一点(按照您的尝试):每次用户切换到另一个选项卡或调整其浏览器窗口的大小时,绘图都必须渲染,因此,如果您手动删除文件,则可能效率低下,因为它需要重新渲染。onSessionEnded解决方案更好,因为它确认会话已结束。

session$onSessionEnded(function() {
   if (!is.null(input$file1)) {
    file.remove(input$file1$datapath)
  }
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章