运行数小时后R Shiny无法启动png()设备的问题求助
解决R Shiny应用Windows下png()设备启动失败问题
问题背景
在Windows 10上运行多个R Shiny应用(部分已稳定运行超1年)服务本地内网,近几周加载图表时出现unable to start png() device错误,重启应用可临时恢复,但数小时后问题复现。未修改R相关配置,更新所有组件也无改善。报错时控制台输出如下:
unable to open file 'C:\Users\jgerla03\AppData\Local\Temp\Rtmp4QtNQ2\file91819b61552' for writing Warning in dev_fun(file = tempfile(), width = width %||% 640, height = height %||% : opening device failed Warning: Error in dev_fun: unable to start png() device 107: dev_fun 106: gg2list 105: ggplotly.ggplot 102: plotly_build.gg 98: getFromNamespace("prepareWidget", "plotly") 97: shinyRenderWidget 96: func 83: renderFunc 82: output$fmc_summary_plot 1: shiny::runApp Warning in normalizePath(path.expand(path), winslash, mustWork) : path[1]="C:\Users\jgerla03\AppData\Local\Temp\Rtmp4QtNQ2": The system cannot find the file specified
应用以管理员权限运行(通过Windows 10任务计划程序或命令行),错误指向的AppData临时文件夹已赋予所有用户读写等全部权限,但“只读”勾选框始终无法彻底取消(取消并应用后仍会重新选中)。
解决方案
1. 自定义Shiny临时目录
避开系统默认临时文件夹的自动清理或权限冲突,手动指定固定目录:
- 在Shiny应用的
app.R或server.R开头添加代码,提前创建好指定目录并赋予管理员完全控制权限:
# 设置自定义临时目录,替换为你实际的路径 Sys.setenv(TMP = "D:/Shiny_Temp") Sys.setenv(TMPDIR = "D:/Shiny_Temp")
- 若目录“只读”属性无法取消,打开管理员命令提示符执行:
attrib -R "D:/Shiny_Temp" /S /D
2. 禁用临时文件夹自动清理
Windows磁盘清理或第三方工具可能误删R的临时会话文件夹:
- 打开「系统属性」→「高级」→「环境变量」,确认
TEMP和TMP指向的路径不在自动清理列表中 - 关闭第三方磁盘清理工具对AppData\Local\Temp的自动清理规则
3. 调整plotly渲染逻辑
错误由ggplotly触发,可尝试绕过png设备依赖:
- 若无需ggplot转换,直接用
plotly::plot_ly()构建图表 - 必须使用
ggplotly时,添加参数禁用静态png fallback:
ggplotly(your_ggplot_obj, staticPlot = FALSE)
4. 定时回收R进程资源
长时间运行可能出现内存泄漏,导致无法创建设备:
- 在server函数中添加定时内存回收逻辑:
shiny::observe({ shiny::invalidateLater(3600000) # 每小时执行一次 gc(verbose = FALSE) })
- 用任务管理器监控R进程的内存和句柄数,若持续增长,排查未释放的对象或数据库连接
5. 强制重置系统临时文件夹权限
Windows文件夹的“只读”标记默认仅影响文件,但仍可强制重置权限:
- 以管理员身份打开命令提示符,执行:
attrib -R "C:\Users\jgerla03\AppData\Local\Temp" /S /D
- 右键临时文件夹→「属性」→「安全」→「编辑」,给当前用户账户添加「完全控制」权限并应用到所有子对象
内容的提问来源于stack exchange,提问作者PirateJenny
相关产品推荐
相关产品推荐

