R で LINEBOT を作ろう


第53回R勉強会@東京(#TokyoR)で発表しました。タイトル通り R で LINE の BOT を作ったという話です。

ソースコードは gist に公開しています。ちなみにコード上部に「ここにボットの動作を設定する」というコメントがありますが、これは会社で営業の人に BOT を作ってもらおうと努力した結果、ここに処理を集約する形になったものです。独自に作っていたらもっと違う形になっていたかもしれません。

言いたかったのは 2 点で shadowy 便利だよということと httr で JSON を組み立てるときは I 関数をうまく使おうということです。後者について軽く補足します。

以下のような JSON を POST したいとします。

{
"foo": ["bar"],
"hoge": "fuga"
}

R では全ての文字列はベクトルになるので、 1 要素のベクトルを JSON で配列にするかしないかを自動では決定できません。 httr ではデフォルトで 1 要素の場合に配列ではなく単一の文字列として扱うのですが、これでは上記の JSON は構築できません。このような場合に以下のように I 関数を利用します。

payload <- list("foo" = I("bar"), "hoge" = "fuga")
POST(endpoint, body = payload, ...)

I 関数をつけたオブジェクトは AsIs というクラスになります。 R では文字列はベクトルなので、ベクトルをそのまま (as-is) JSON で表現するには配列が適当ということになります。

HTTP リクエスト・レスポンスを構築する際に複雑な JSON を作りたくなった場合には必ず必要となるので、覚えておきたいですね。