Automatorを使ってRのコードを自動で動かした話


はじめに

rtweet を使ってツイートを取得してるんですが、無料版APIだと検索できる時期が限定されるので、定期的にツイートを取得できるようにしたら便利だなと思ったのでやってみました。

Rスクリプト

今回動かしたのはこちらのコード

fake_tag <- as.vector(read.table("/Users/tsujimurayuki/Documents/tw_collect/fake.txt", 
                                 fileEncoding="UTF-8")[,1]) # ハッシュタグを読み込み

本当はハッシュタグをスクリプト上で指定したいんですが日本語書いたらエラーはいたので指定したいハッシュタグをテキストファイルとして保存したものをエンコーディング指定して読み込んでいます。指定したタグは以下の通り。

[1] "#トランプ大統領の再選を支持します"    
[2] "#トランプ大統領を支持します"          
[3] "#トランプ大統領の再選を断固支持します"
[4] "#バイデン不正"                        
[5] "#バイデンの不正を許すな"            

このタグを使っているツイートを検索して保存します。
*なんでかよくわからんけどパッケージ同士でぶつかってエラーはいたのでパッケージを個別に指定して書いてます。(上手いやり方知ってる人いたら教えて欲しい)

dat1 <- rtweet::search_tweets(paste(paste(fake_tag, collapse =  " OR "), 
                           "filter:retweets", paste0("since:", Sys.Date()-1),
                           paste0("until:", Sys.Date()),
                           sep = " "), 
                     n=18000, include_rts = TRUE, 
                     retryonratelimit = TRUE)
dat2 <- magrittr::`%>%`(dat1, 
                        dplyr::select(user_id, created_at, screen_name, 
                                      text, retweet_screen_name))
path <- paste("/Users/tsujimurayuki/Desktop/UTTData/code&data/twitter_analysis") # スクリプトの置き場所とデータの保存先が違うので指定
readr::write_rds(dat1, paste0(path, paste("/data/fake news/tweets/fake", 
                             Sys.Date()-1, sep = "_"), ".rds"))
readr::write_csv(dat2, paste0(path, paste("/data/fake news/tweets/fake", 
                            Sys.Date()-1, sep = "_"), ".csv"))

シェルスクリプト

Automatorのカレンダーアラームを使って昼時に毎日定時にコードを実行するようにしたいので、設定した時間にシェルスクリプトでRスクリプトを動かすよう設定します。


cd Documents/tw_collect
/Library/Frameworks/R.framework/Versions/3.6/Resources/bin/Rscript --encoding=UTF-8 collect.R

シェルスクリプトの書き方とか初めてだったんですけど、この場合はそんなに複雑じゃなかったです。
1行目でディレクトリの設定、2行目でRスクリプトを動かしています。
シェルスクリプトの場合、cdでディレクトリ指定 (Rの setwd() 的な) ができます。今回は、RスクリプトをDocument内にある tw_collect フォルダにテキストファイルとRスクリプトを置いてあります。

2行目の部分で Rscript ファイルを呼び出しています。こいつをシェルスクリプトで動かすとRのコードを動かしてくれます。(パスは計算機の種類やRのバージョンとかによって違うぽいので自分でやるときは気をつけてください。)
これは2つの引数、エンコーディングと実行するファイルを取ります。今回はエンコーディングでUTF-8、実行するファイルとして上記のコードを collect.R として指定しています。

あとはAutomatorでシェルスクリプトを指定、このコードを書いてカレンダーでいつ実行するかを決めてやれば指定した時間に勝手に動いてくれる..はず。

出来上がりはこんな感じ。