我正在开发一个闪亮的应用程序,用户可以在该应用程序中上传文件并选择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] 删除。
我来说两句