使用闪亮时的临时文件
Tempfiles when using shiny
我正在开发一个闪亮的应用程序,用户可以在其中上传文件和 select X 参数,之后他按下一个按钮,它会生成 5 个图(ggplot2 和 barplot)以及一个动态数据 table (DT)。此外,我想将我闪亮的应用程序放入 linux 服务器。
我使用 tempfiles()
为我用来创建绘图和 DT 的每个文件。
之后,我的问题是:
当用户关闭 shiny 应用程序(关闭 window)时,临时文件会自动删除吗?
如果没有,我该如何删除临时文件?
我的尝试:
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 次,则 window 将关闭,它只会删除最后生成的文件。第二部分删除临时目录中的所有文件,但这会影响其他用户吗?(我认为是的,所以这就是为什么我需要另一个解决方案)。
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
) 也有一个内置机制,可以清除文件上传目录 如果您担心的话。以下代码在会话结束时删除上传目录:
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)
}
关于手动删除您的临时文件的另一点(如您所尝试的那样):每次用户切换到另一个选项卡或调整他/她的浏览器大小时,该图都必须呈现 window,所以如果您'手动删除文件,它可能效率低下,因为它需要再次重新渲染。 onSessionEnded
解决方案更好,因为它确认会话已结束。
session$onSessionEnded(function() {
if (!is.null(input$file1)) {
file.remove(input$file1$datapath)
}
})
我正在开发一个闪亮的应用程序,用户可以在其中上传文件和 select X 参数,之后他按下一个按钮,它会生成 5 个图(ggplot2 和 barplot)以及一个动态数据 table (DT)。此外,我想将我闪亮的应用程序放入 linux 服务器。
我使用 tempfiles()
为我用来创建绘图和 DT 的每个文件。
之后,我的问题是:
当用户关闭 shiny 应用程序(关闭 window)时,临时文件会自动删除吗?
如果没有,我该如何删除临时文件?
我的尝试:
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 次,则 window 将关闭,它只会删除最后生成的文件。第二部分删除临时目录中的所有文件,但这会影响其他用户吗?(我认为是的,所以这就是为什么我需要另一个解决方案)。
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
) 也有一个内置机制,可以清除文件上传目录 如果您担心的话。以下代码在会话结束时删除上传目录:
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)
}
关于手动删除您的临时文件的另一点(如您所尝试的那样):每次用户切换到另一个选项卡或调整他/她的浏览器大小时,该图都必须呈现 window,所以如果您'手动删除文件,它可能效率低下,因为它需要再次重新渲染。 onSessionEnded
解决方案更好,因为它确认会话已结束。
session$onSessionEnded(function() {
if (!is.null(input$file1)) {
file.remove(input$file1$datapath)
}
})