我正在尝试使用每两个小时运行一次的Windows任务调度程序运行一个R脚本文件。我想要做的是通过Twitter API收集一些推文并运行情绪分析,生成两个图并将其保存在目录中。问题是,当脚本再次运行时,它将替换目录中具有该名称的现有文件。
例如,当我使用pdf(“file”)函数时,它第一次运行正常,因为目录中没有已存在具有该名称的文件。问题是我希望R-script每隔一小时运行一次。所以,我需要一些解决方案,在目录中创建一个新文件,而不是替换该文件。就像从谷歌浏览器多次下载文件时发生的情况一样。
答案 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
检查文件是否存在,然后重命名现有文件,或为新文件创建其他名称。