🔧RでREST APIを作る(plumber編)
様々なAPIを利用していると、次第に自分でもAPIを作りたくなりませんか? Rの関数を利用してHTTP経由でデータの受け渡しができると嬉しいですよね。加えて、Rの作図機能を使って、APIを叩くだけで作図してくれると超ハッピーですよね。
前置きも何もなく唐突ですが、{plumber}
パッケージを使ってお手軽にRでAPIサーバーを構築できるヨ、という話です。{plumber}
はまだCRANに登録されていないので、利用する際にはGitHubから開発版をインストールしてきてください。
🤔RでAPIサーバー?
「RでAPIサーバーを作る」という話自体は昨年末のJapan.Rでゴミ箱さんが話されていたのですが、運営側だったこともあってしっかりと聞けていませんでした(この記事を書こうとして、そういえばゴミ箱さんがRでAPIを作る、みたいな話していたよなというのを思い出した)。ゴミ箱さんの話の中でも{plumber}
について言及しています。
何ができるの?
ざっくりと説明するとRコードの処理をURL経由で取得・表示することが可能になります。どこかでAPIサーバーとしてRコードを実行しておけば、URLにアクセスするだけで結果を得たりすることができます。
Rの演算能力や統計処理の結果をウェブブラウザでみたり、プロットを表示したりできます。基礎になるのはRのコードなので、パラメータを定義しておくことで利用者の用途に応じた出力が可能になるなんて素敵だと思いませんか。
というわけでやってみましょう。
{plumber}
パッケージの利点は、既存のRコードに手をつけずAPI化できる点にあります。
🍭knitrでSQLの実行結果を出力する際はengine.optsを指定する
Rによるレポート作成で用いられる{knitr}
パッケージでは、RだけでなくbashやPython、SASと言った多様な言語の実行を可能にしている。RMarkdownのチャンクとして呼び出すわけだけど、MySQLをエンジンにした場合にちょっと躓いた(これをやる機会はなかなかないだろうけど、今日の私には必要だったのだ...)。
{r, engine='mysql'} use mysql; show tables; # ERROR 1045 (28000): Access denied for user 'uri'@'localhost' (using password: NO) # Calls: <Anonymous> ... process_group.block -> call_block -> block_exec -> in_dir -> engine # In addition: Warning message: # running command ''mysql' -e 'use mysql;
いや、そもそもデータベースに接続できないよ!って怒られる。というわけでこのチャンクの前に
{r, engine='bash'} mysql --user=root --password=pass
をしても、正常に出力されない...。困ったナ、となって調べてみたら解決策が見つかった。チャンクオプションのengine.optsに接続に必要なbashスクリプトを記述しておけば良い。
{r, engine = 'mysql', engine.opts = "mysql --user=root --password=pass"} use mysql; show tables; exit続きを読む
⭐️PDFの情報・文章をRでごっそり取得する
便利なRパッケージを見つけたのでメモがてら紹介しておきます。以前、Rを使ってPDF上のテキストを取得するパッケージとして{tm}
パッケージを紹介しましたが、同様の機能をもった{pdftools}
は以下の特徴があります。
- PDFがもつ各種の情報やテキストを取得できる
- 日本語も問題なし
- PDFがロックされている場合、パスワードで開ける
- PDFを画像として出力できる
開発者はrOpenSciの一員でもあるJeroen Oomsです。
{tm}
パッケージでは日本語が含まれるPDFを扱う際にはちょっとした工夫が必要でしたが、{pdftools}
では日本語の出力も問題なく行うことができてちょっと感動しました。機能としてPDFの情報を得る、ということとPDFを画像として出力する、というものがあります。