Отправка электронной почты из R - при сбое запланированного сценария в Windows

У меня есть Rscript-файл (Main_Script.R), который запускается как запланированное задание в планировщике задач Windows каждые 30 минут. Main_Script.R - У меня есть около 13 сценариев, которые запускаются каждые 30 минут.

Я хотел отправить письмо от R - всякий раз, когда итерация не удалась или взломали. Я использую пакет sendMailR - и я видел сообщение в SO how to send email with attachment from R in windows о том, как отправить emqil из R Windows.

Но я не уверен насчет - как отправить email automatically with the error message - когда запланированная итерация задачи не пройдена или не исправлена.

мой Main_Script.R - имеет source всего 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 и именем или номером сценария, чтобы указать, какой из 13 сценариев завершился неудачно, и отправить на почтовый идентификатор.

1 ответ

Решение

Вот решение, которое оборачивает ваш скрипт источников:

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 функционировать отдельно, пока не работает.

Другие вопросы по тегам