r - 使用 Shiny 时的临时文件

标签 r shiny temporary-files

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

我正在为我用来创建绘图和 DT 的每个文件使用 tempfiles()

之后,我的问题是:

当用户关闭 Shiny 的应用程序(关闭窗口)时,临时文件会自动删除吗?

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

我的尝试:

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 次,则窗口关闭,并且只会删除最后生成的文件。第二部分删除临时目录中的所有文件,但这会影响其他用户吗?(我认为是的,所以这就是为什么我需要另一个解决方案)。

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

我担心的是,如果临时文件不会自动删除,Linux 服务器会因为大量临时文件而崩溃。

希望你能解决我的疑惑。阿特·琼。

最佳答案

如果您希望render 函数自动删除您的临时文件,您可以使用deleteFile=TRUE 参数:

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) 也有一个内置机制,可以清除文件上传目录。以下代码在 session 结束时删除上传目录:

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 已结束。

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

关于r - 使用 Shiny 时的临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49979366/

相关文章:

javascript - 如何在 nodejs 中的多次运行之间保留临时文件?

r - 使用列名称模式对跨多列的 gt 表中的单元格进行着色

复制后data.table中的引用问题

r - 如何替换语言对象中的符号?

r - 在 r 中,如何根据列表元素对数据框的一些列降序排列,而其他列升序排列?

Python:tempfile.mkdtemp 和 tempfile.TemporaryDirectory 之间的区别

java - android中如何读取临时数据

r - R中折线图下方的阴影

r - eventReactive 对所有输入值使用react

检索选择名称而不是值