2015年2月24日 星期二

[R] 提醒程序執行完成

在使用R的過程中,遇到冗長的模型配飾或模擬時,可以利用這兩個程序來提醒你程式已經跑完。

一是beepr這個package,執行後電腦會發出聲音提醒你程式已經跑完。

範例:
library(beepr)
beep(sound=8)

其中,sound後面的數字有1~10,我通常用8因為這會發出超級瑪利跑到關卡最後拉下城堡旗子的過關聲音(下方影片第28秒):


這適用於能在1~2小時內跑完的程式,這樣等輸出指令後就可以切換視窗去做別的事情,然後等聽到這個提示音就可以切換回來R的視窗收output。

若時間更長,你可能會離開辦公室,但又想要知道程式有沒有在你不在的時間跑完,可以用sendmailR這個package。這個package會送訊息到自己指定的email帳號。

範例:

sendmail_options(smtpServer="ASPMX.L.GOOGLE.COM")
sendmail(from="<chienorz@gmail.com>", to="<chienorz@gmail.com>", subject="Work Complete!", msg="Work Complete!")

其中,sendmail_option是用來指定電子郵件的SMTP伺服器。以gmail為例,其SMTP伺服器是ASPMX.L.GOOGLE.COM。

其次,sendmail這個函式是主程式,包含四個主要的option:

  • From: 從哪個email address送出
  • To: 用哪個email address收件
  • subject: 信件主題
  • msg: 信件內容
基本上From option指定送出的email address可以亂寫,但To option指定收件的email address必須要有符合的SMTP伺服器設定好在sendmail_options函式裡面。所以如果sendmail_options指定的SMTP伺服器跟To option後面指定的email address所用的SMTP伺服器不同的話,這個函式就不會有作用。subject和msg這兩個option可以隨便打,但我用"Work Complete"是有特殊用意。因為如果電子郵件太多,則R送出來的電子郵件可能會被埋掉,所以我做了一個轉發的設定,就是讓gmail收到以Work Complete的信件時,gmail會自動將其轉發到我的手機簡訊裡面,並且把原本從R送到gmail的郵件給刪除。方法如下:
  1. 到gmail的設定處點選Forwarding and POP/IMAP標籤。
  2. 點選Add a forwarding address
  3. 然後去查如何把手機簡訊轉成email address。以我的Verizon為例,簡訊的email address就是"9碼電話號碼@vtext.com"
  4. 設定好後,可以建立filter,讓主題有Work Complete字樣的email都主動轉發。
  5. 最後設定要被轉發的信件該如何處理,有四個選項,我是選擇delete Gmail's copy。
如此一來,在輸出程式時, 順便把sendmail()輸出(sendmail_options()可以在程式一開頭就設定好,不用每次都跑),等到程式跑完時,接著就會跑sendmail(),然後手機就會收到程式跑完的簡訊。

如果你的手機通訊商有SMTP伺服器,就不用設定gmail而是直接從R寄信到手機簡訊裡。以Verizon為例,假設手機號碼是123456789,則手機簡訊的email address是123456789@vtext.com。則程式可以改成:

sendmail(from="<chienorz@gmail.com>", to="<123456789@vtext.com>", subject="Work Complete!", msg="Work Complete!")

但問題是Version沒有給@vtext.com一個SMTP伺服器。網路上雖然可以查到但不能使用,所以才必須使用gmail來轉發。


沒有留言:

張貼留言