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

时间:2014-08-21 14:54:52

标签: r

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

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

2 个答案:

答案 0 :(得分:5)

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

> 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"

如果多个进程可能正在写一个新文件,这种事情可能会中断 - 如果两个进程同时检查那里有一个机会窗口,其中两个进程都看不到&#34 ; foo.2"并认为他们都可以创造它。如果你有两个进程试图同时写新文件,那么时间戳也会发生同样的事情。

这两个问题都可以通过生成随机UUID并将其粘贴到文件名来解决,否则您需要在操作系统级别使用原子。

但对于每小时两次的工作,我认为时间戳可能已经足够几分钟了。

答案 1 :(得分:1)

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