読者です 読者をやめる 読者になる 読者になる

まだ厨二病

RとPyhtonを使ったデータ分析・統計解析らへんの話題をしていくだけ

🍭 インタラクティブな認証が必要な関数の処理を魔改造してR Markdownでも実行可能にする

httr tips rmarkdown

ウェブAPIのラッパーパッケージを利用する際に{httr}パッケージは認証に必要な関数を備えており、これらのラッパーパッケージにおいては主な手法として利用されている。その理由として、{httr}パッケージが認証処理を実行する関数を備えていることがあげられる。ウェブAPIの大部分はAPIキーやアクセストークンを与えた認証を必要とするが、httr::oauth2.0_token()などを使うことでR上でもこれらの処理を実行できるという体系が構築可能である。認証はブラウザを通して行われることが多く、ユーザーが許可を与えることにより、ラッパーパッケージが提供する諸々の関数を利用可能になる(背景の処理で.httr-oauthという隠しファイルを利用したりする)。

さて、通常のウェブAPIをラップした関数をコンソール上で実行するにはこの方法で良いが、これらの関数をcronなどのスケジュール機能を使って自動的に走らせる時や、拡張子.Rmdでレポートを生成する際にはこの方法はうまくいかない。結論からいうと、これらの処理の中で{httr}ベースの関数を実行する際にはインタラクティブモードを有効にしている必要がある

例えば、 {twitteR}パッケージを使って、Rmdファイルからレポートを作成したい、というような時には

# 認証のための関数
setup_twitter_oauth(consumer_key = "<your_consumer_key>", 
    consumer_secret = "<your_consumer_secret_key>")
# 「rstudio」が含まれるつぶやきを取得する
searchTwitter("rstudio", n = 10)

のようなコードを利用するが、これをそのまま.Rmdファイルにコピーしてknitを実行すると

Error: oauth_listener() needs an interactive environment.

というエラーが返ってきて、コードは実行されずにレポートも生成されない場合がある({RGA}パッケージのように認証情報を別の形で保存していれば別)。oauth_listener(){httr}の関数で、引数のis_interactiveTRUEが与えられないと今回のように処理を中止する。is_interactive引数の判定にはinteractive()関数が利用されており、ここでインタラクティブモードの確認が行われる。

通常のGUI RやRStudioのファイルから実行するとTRUEになるのだけど、RStudioのKnitボタンを押して実行されるrender環境ではFALSEである。というわけでこれを回避するために強制的にインタラクティブモードとしてレポートを生成してみたい。

対象の.Rmdファイルに次の処理を追加しておくだけ。

unlockBinding("interactive", as.environment("package:base"))
assign("interactive", function() TRUE, envir = as.environment("package:base"))

これでおk。あとは煮るなり焼くなり。

f:id:u_ribo:20160213091924p:plain

注意として、認証の部分はブラウザを介しての処理なので一度インタラクティブモードで実行しておく必要がある。

余談

上の例はあくまでもコンピュータに自動的に行わせるもので必要な処理なので、ユーザーの手によって実行される(インタラクティブモードで生成される)のであれば

rmarkdown::render("report.Rmd")

で良い。

参考

stackoverflow.com