繁体   English   中英

如果已存在具有该名称的文件,如何在R中创建新的输出文件?

[英]How to create a new output file in R if a file with that name already exists?

我试图使用Windows任务调度程序运行一个R脚本文件,每两个小时运行一次。 我想要做的是通过Twitter API收集一些推文并运行情绪分析,生成两个图并将其保存在目录中。 问题是,当脚本再次运行时,它将替换目录中具有该名称的现有文件。

例如,当我使用pdf(“file”)函数时,它第一次运行正常,因为目录中没有已存在具有该名称的文件。 问题是我希望R-script每隔一小时运行一次。 所以,我需要一些解决方案,在目录中创建一个新文件,而不是替换该文件。 就像从谷歌浏览器多次下载文件时发生的情况一样。

我只是给文件名加盖时间戳。

> filename = paste("output-",now(),sep="")
> filename
[1] "output-2014-08-21 16:02:45"

使用任何标准日期格式化函数来自定义 - 可能您不希望文件名中包含空格和冒号:

> filename = paste("output-",format(Sys.time(), "%a-%b-%d-%H-%M-%S-%Y"),sep="")
> filename
[1] "output-Thu-Aug-21-16-03-30-2014"

如果您想要在文件名中添加数字的行为,那么这样的事情:

serialNext = function(prefix){
    if(!file.exists(prefix)){return(prefix)}
    i=1
    repeat {
       f = paste(prefix,i,sep=".")
       if(!file.exists(f)){return(f)}
       i=i+1
     }
  }

用法。 首先,“foo”不存在,因此返回“foo”:

> serialNext("foo")
[1] "foo"

写一个名为“foo”的文件:

> cat("fnord",file="foo")

现在它返回“ foo.1”:

> serialNext("foo")
[1] "foo.1"

创建它,然后它返回“foo.2”,依此类推......

> cat("fnord",file="foo.1")
> serialNext("foo")
[1] "foo.2"

如果多个进程可能正在写一个新文件,这种事情可能会破坏 - 如果两个进程同时检查有一个机会窗口,其中两个进程都看不到“foo.2”并认为它们都可以创建它。 如果您有两个进程同时尝试写入新文件,那么时间戳也会发生同样的情况。

通过生成随机UUID并将其粘贴在文件名上,可以解决这两个问题,否则,您需要在操作系统级别上具有原子性的东西。

但是对于每小时两次的工作,我认为将时间戳记缩短到几分钟可能就足够了。

有关文件操作功能,请参见?files 您可以使用file.exists检查文件是否存在,然后重命名现有文件,或为新文件创建其他名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM