【问题标题】:Temp files automatically deleted in R shiny app - Error in file: cannot open the connectionR闪亮应用程序中自动删除的临时文件 - 文件错误:无法打开连接
【发布时间】:2019-04-08 16:13:15
【问题描述】:

我创建了一个 R 闪亮的应用程序,它使用批处理文件每天自动运行。 启动应用程序时一切正常,但第二天它崩溃了,我收到以下消息:

Warning in file(open = "w+") :
  cannot open file
'C:\Users\bertin\AppData\Local\Temp\RtmpKiBPOU\Rf3f835d1a66' : No such file or directory
Warning: Error in file: cannot open the connection
  [No stack trace available]

实际上,这个问题与 R 会话执行闪亮应用程序创建的 tempdir() 文件夹有关。此文件夹会在一定时间后自动删除。我是否必须在每次刷新时删除所有临时文件?或者相反,是否需要防止 R 删除 Temp 文件夹中所有闪亮的临时文件?谢谢!


编辑 - 以下是故意生成错误的方法:

tempdir()
dir.exists(tempdir())

library(shiny)

# Windows shell required
shinyApp(
    ui = fluidPage("Please reload to see me fail."),
    server = function(input, output) {
        shell(paste("rmdir", dQuote(
            normalizePath(tempdir(), winslash = "/", mustWork = FALSE), q = FALSE
        ), "/s /q"))
    }
)

【问题讨论】:

  • 使用tempdir()tempfile() 创建的任何内容都会在与它们关联的R 进程消失后消失。如果您正在使用这些并期望长期存储,您将会感到失望。如果您将某些东西存储在需要半永久性的“临时”目录中,则需要创建一个有意的路径来存储文件并从现在开始使用它并自行进行清理管理。跨度>
  • 感谢您的回答,但我没有在 tempdir() 或 tempfile() 上创建任何内容:这是由 R 在启动闪亮应用程序时自动创建的,并在一定时间后被系统自动删除...
  • @hrbrmstr 实际上是shiny 本身将文件存储在tempdir() 中。这是一个相关的GitHub issue。我有同样的problem
  • 添加了一个 gif here 展示如何重现问题。
  • 不错的 gif 再现性!从您的 github 评论中可以推断出您也在寻找解决方法?我唯一能想到的(不包括闪亮/rstudio 团队)将是以下内容:1)在闪亮的应用程序启动时调用一个函数,该函数会复制tempdir(),称为paste0(tempdir(), "copy") 2)也让检查启动闪亮应用程序是否存在 tempdir,如果不存在则将 tempdir 更改为复制路径 stackoverflow.com/questions/17107206/change-temporary-directory。然后为下一次制作另一个 tempdir 副本。 (复制文件对我来说失败了。)

标签: r shiny connection temp


【解决方案1】:

到目前为止,我在 Windows 10 (Storage Sense) 中找到了一个关于删除临时文件的设置,该设置似乎默认处于活动状态。

如下导航并取消选中

  1. 设置
  2. 系统存储
  3. 存储感知
  4. 更改我们自动释放空间的方式
  5. 删除我的应用未使用的临时文件

【讨论】:

    【解决方案2】:

    删除临时目录后,会话数据也会丢失。但是,如果我正确理解您的问题,这与您的 Shiny Application 无关。 因此,如果您不需要昨天的任何会话数据,您可以调用“.rs.restartR()”来重新启动您的 R 会话,从而设置一个新的临时目录。您可能会收到无法保存上一个会话的错误(因为该目录不再存在)。 在此之后,您应该能够再次启动您的 Shiny 应用程序。

    【讨论】:

    • 感谢您的回答!说清楚:临时目录的删除不是故意的。在应用程序空闲一段时间后,它对 Windows 机器产生了不良影响(上面的代码只是重现错误的示例)。 .rs.restartR() 似乎只能在 RStudio 之外工作 - 使用 RScript.exe 时会出现问题。此外,重新启动 R(和应用程序)的过程不是问题。问题是如何防止上述错误,或者如何在错误发生后触发重新启动。
    • 我确实明白删除临时目录不是故意的。但这是临时目录的本质:它会在将来的某个时间被系统删除......我不确定你是否打算阻止删除临时目录,或者你是否想将 R 设置为状态它可以(再次)启动闪亮的应用程序。
    • 我知道人们不应该期望来自tempdir() 的持久存储。我不是合并tempdir() 的那个——它被用在闪亮的源代码中(不使用它的参数check = TRUE)。对我来说,这两种选择都可以(防止或对错误做出反应)。重点是不要最终得到一个不死的闪亮应用程序,它实际上仍在运行,但除了Error in file: cannot open the connection之外不能为用户提供任何服务。
    • 在这里授予赏金,因为这是唯一的答案,否则它会简单地消失。干杯
    • 非常感谢。我仍在考虑一种方法,但直到周二才能访问 Windows 机器来测试它......想法是:我们可以做些什么来让正在运行的应用程序在空闲时间安全关闭,以便它可以安全启动第二天早上。 (您是否尝试过在 vanilla 模式下运行 Rscript?)
    猜你喜欢
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多