製造系SEのメモ

普段気になった内容をメモしていきます

Rのバッチ処理とタスクスケジューラによる自動化(Windows10)

f:id:asakat:20190130204302j:plain

Rのスクリプトを定期的に自動処理させる方法を調べたのでメモします。
※読み飛ばしたい場合はバッチファイル作成から読んでも問題ないと思います

やりたいこと

以前、気象庁のホームページから2019年1月1日の東京都における気象データをRで取得しましたが、今回は1日前の東京都における気象データ(10分ごとの値)を毎日自動的に取得するようにします。

以前の内容:
asakat.hatenablog.com


自動処理させたいスクリプト

今回自動処理させたいスクリプトは以下の内容です。

library(XML)
library(dplyr)

#昨日の日付を取得
date <- Sys.Date()-1

#年月日をそれぞれsubstring()関数で抽出
year <- substring(date, 1, 4) %>% as.numeric()
month <- substring(date, 6, 7) %>% as.numeric()
day <- substring(date, 9, 10) %>% as.numeric()

#paste0()関数でURL内に年月日を挿入
url <- paste0("http://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=", year, "&month=", month, "&day=", day, "&view=")

#readHTMLTable()関数でテーブル読み込み
read <- readHTMLTable(url, header = FALSE, stringsAsFactors = FALSE, which = 5, skip.rows = 1:2)

#読み込んだテーブルの列名を設定
table <- read %>%
  rename(時分 = V1, 気圧_海面 = V2, 気圧_現地 = V3,
           降水量 = V4, 気温 = V5, 相対湿度 = V6,
           風速_平均 = V7, 風向_平均 =V8, 風速_最大 = V9,
           風向_最大 = V10, 日照時間 = V11)

#データをcsvファイルで出力
write.csv(table, paste0(date, ".csv"), row.names = FALSE)

Sys.Date()関数で現在の日付を取得できるので「Sys.Date()-1」で1日前の日付を取得しています。
また、今回の気象データはURLを書き換えれば対象とする日付を操作できるので、年月日をそれぞれsubstring()関数で抽出してas.numeric()関数で数値化した後、paste0()関数でURLの該当部分に挿入しています。
そして、気象データを取得して【取得した気象データの日付】.csvとしてフォルダ内に保存させています。

バッチファイル作成

自動化するにはまずはバッチファイルを作成する必要があります。
以下の内容のバッチファイルを作成し、スクリプトファイルと同じフォルダ(今回の例ではドキュメントフォルダ直下)に保存します。

※今回は、バッチファイルを「weather.bat」、スクリプトファイルを「readhtml.R」というファイル名で作成しています

cd C:\Users\【ユーザー名】\Documents
"C:\Program Files\R\R-3.5.2\bin\rscript.exe" --encoding=utf-8 readhtml.R

ここではスクリプトファイルがあるフォルダに移動し、Rscriptを使用してスクリプトを走らせる」という処理を行おうとしています。
「"C:\Program Files\R\R-3.5.2\bin\rscript.exe"」部分はPCやRのバージョンによって異なるので確認が必要です。
また、スクリプト内に日本語が含まれている状態でRscriptを使用してスクリプトを走らせるとエラーで止まってしまうため、「--encoding=utf-8文字コードを指定しています。
※以下を参考にしました
ja.stackoverflow.com


この状態でバッチファイルを実行するとドキュメントフォルダ直下にcsvファイルが保存されます。
f:id:asakat:20190323135719p:plain

タスクスケジューラの設定

後はこのバッチファイルをタスクスケジューラでタスクとして設定します。

まずは、タスクスケジューラを開きます。
f:id:asakat:20190323140943p:plain

タスクスケジューラが表示されるので、「基本タスクの作成…」をクリックします。
f:id:asakat:20190323142858p:plain

タスクの名前を設定します。
f:id:asakat:20190323141321p:plain

タスクを実行するトリガーを設定します。今回は毎日10:00に実行するよう設定しています。
f:id:asakat:20190323141429p:plain
f:id:asakat:20190323141513p:plain

操作は「プログラムの開始」です。
f:id:asakat:20190323141557p:plain

バッチファイルを指定します。
f:id:asakat:20190323141724p:plain

これで完了です。
f:id:asakat:20190323141918p:plain

試しに実行してエラーが出なかったら問題ないはずです。
f:id:asakat:20190323145632p:plain


私の場合は以上の手順でバッチ化とタスクスケジューラによる自動処理が設定できました。
エラーの対処に少し苦労しましたが、検索しても日本語で解説してくれているページが多くないため、「r taskscheduler batch」等で検索してGoogle翻訳に放り込みましたのでご参考までに。



以上です。