从R发送电子邮件 - 当计划脚本在Windows中失败时

时间:2014-08-26 03:40:09

标签: r email sendmailr

我有一个Rscript文件(Main_Script.R),它每隔30分钟就在Windows任务计划程序中作为一个重要的工作运行。在Main_Script.R之内 - 我有大约13个脚本,每30分钟运行一次。

我想从R发送电子邮件 - 每当迭代失败或被骚扰时。 我正在使用sendMailR包 - 我在SO how to send email with attachment from R in windows中看过一篇关于如何从R Windows发送emqil的帖子。

但我不确定 - 如何在计划任务迭代失败或被骚扰时发送email automatically with the error message

我的Main_Script.R - 拥有所有13个代码中的source个。

source(paste(rootAddress,"Scripts/Part1.R",sep =''))
source(paste(rootAddress,"Scripts/Part2.R",sep =''))
:
:
:
:
source(paste(rootAddress,"Scripts/Part13.R",sep =''))

My Sheduled任务如下所示,带有日志文件

"D:\xxx\R-3.0.2\bin\x64\Rscript.exe" "D:\xx\Batch_Processing\Batch_Processing_Run\Scripts\Main_Test.R" >> "D:\XXX\Batch_Processing\Batch_Processing_Run\error.txt" 2>&1

更新:

当脚本遇到错误时 - 它应该触发电子邮件 - 使用erorr meassge和脚本名称或编号 - 表示13个脚本中的哪一个失败并发送到邮件ID。

1 个答案:

答案 0 :(得分:6)

这是一个包装你的源代码的解决方案:

tryCatch({
source("fail1.R")
source("fail2.R")
source("fail3.R")
},
         error=function(e){cat("send email with error ",e$message,"\n")})

我的脚本是:

if(x==1){stop("Fail One!")}

和类似的。因此:

> x=22
> source("doall.R")
> x=2
> source("doall.R")
send email with error  Fail Two! 

所以用您的电子邮件发送和完成工作替换我的cat。错误作为参数传递给处理程序,因此您可以从中获取消息。

以下是如何使用13个脚本编写的示例,并确定哪个出错:

for(i in 1:13){
 try( {
      source(paste(rootAddress,"Scripts/Part",i,".R",sep =''))
      },
      error = function(e){mailMe(i, e$message)}
    )
}

现在您只需编写mailMe函数,该函数可获取脚本编号和错误消息。它可能是这样的:

mailMe = function(i, message){
  subject=paste("Error in script ",i)
  body = paste("Error was ",message," in script ",i)
  someSendmailRfunction(to="me@my.come", subject=subject,body=body, etc=etc)
}

请注意,您可以单独测试mailMe功能,直到它起作用。