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

从R发送电子邮件-在Windows中计划的脚本失败时,r,email,sendmailr,R,Email,Sendmailr,我有一个Rscript文件(Main_Script.R),它作为windows任务计划程序中的计划作业每30分钟运行一次。在Main_Script.R中,我有大约13个脚本每30分钟运行一次 我想在迭代失败或延迟时从R发送电子邮件。 我正在使用sendMailR软件包-我在SO中看到了一篇关于如何从windows中的R发送带有附件的电子邮件的帖子 但我不确定当计划的任务迭代失败或拖拉时,如何自动发送带有错误消息的电子邮件 我的Main_Script.R-包含所有13个代码的源代码 source(

我有一个Rscript文件(Main_Script.R),它作为windows任务计划程序中的计划作业每30分钟运行一次。在
Main_Script.R
中,我有大约13个脚本每30分钟运行一次

我想在迭代失败或延迟时从R发送电子邮件。 我正在使用sendMailR软件包-我在SO
中看到了一篇关于如何从windows中的R发送带有附件的电子邮件的帖子

但我不确定当计划的任务迭代失败或拖拉时,如何自动发送带有错误消息的
电子邮件

我的
Main_Script.R
-包含所有13个代码的
源代码

source(paste(rootAddress,"Scripts/Part1.R",sep =''))
source(paste(rootAddress,"Scripts/Part2.R",sep =''))
:
:
:
:
source(paste(rootAddress,"Scripts/Part13.R",sep =''))
我的计划任务与下面的日志文件类似

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

以下是一个解决方案,它可以包装您的源代码脚本:

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
功能,直到它工作为止。

将您的语句包装在
tryCatch
中,在评估之后,捕获任何错误并发送电子邮件。我有大约13个脚本-
tryCatch
它们将非常难捕获每个错误,是否有其他方法获取错误并将其附加到邮件中。
(选项(错误=(…)
在互联网上看到了这个建议,但不知道怎么做。你只需要一个
tryCatch
,它包含了你所有的
源代码
呼叫。那么现在这是两个问题吗?你知道如何从R发送电子邮件吗?我的问题是-我不知道当脚本在批处理作业中失败时如何发送电子邮件。对于发送任何电子邮件,在所以-我的意思是,我可以参考并开始工作。托克,我正在尝试你的方法-但我在
发送电子邮件时遇到了一个问题作为一个错误函数。我已经更新了这个问题-我还需要知道13个脚本中的哪一个failed@PrasannaNandakumar首先学习如何从
tryCatch
中捕获1001位。其余的应该是i我想问另一个问题,关于如何使用
tryCatch
判断哪个脚本产生错误。制作一个可复制的示例,展示一些努力,答案是肯定的。@RomanLuštrik我按照上面的答案尝试使用错误函数发送电子邮件。但是我以前没有使用Sendmairr包,因此,我正在尽最大努力在error模块(使用sendmailR包)内创建邮件功能来发送邮件。