我正在尝试使用每两个小时运行一次的Windows任务计划程序运行R脚本文件。我想做的是通过Twitter API收集一些推文,并运行情感分析,该分析产生两个图并将其保存在目录中。问题是,当再次运行脚本时,它将用目录中的该名称替换已经存在的文件。
例如,当我使用pdf(“ file”)函数时,它第一次运行良好,因为目录中不存在具有该名称的文件。问题是我希望R脚本每隔一小时运行一次。因此,我需要一些在目录中创建新文件而不是替换该文件的解决方案。就像从Chrome浏览器多次下载文件时会发生什么。
我只是给文件名加上时间戳。
> 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并将其粘贴在文件名上,可以解决这两个问题,否则,您需要在操作系统级别上具有原子性的东西。
但是对于每小时两次的工作,我认为将时间戳记缩短到几分钟可能就足够了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句