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

RStudioからQiitaに直接投稿できるアドインをつくってみました

R RStudio RStudio addin Qiita

Qiitaで記事を書く時、R Markdownをknitしたやつを直接アップロードできるといいのになー、と思ったのでつくってみました。

ただし、これはProof of Concept的なもので、実用に耐えるものではありません。たぶん。

なんでまじめに作りこむ気が起きないかというと、Qiita API v2には画像をアップロードするAPIがないので、ggplot2逆引きの記事を書こうと思うと結局画像はQiita上でアップロードしないとだめだからです。

まあ、画像だけgistとか別の場所に上げちゃうのもありかもしれません。どうするのがいいか今は思いつかないので、どなたか気が向いたらプルリクください。

RStudioアドインとは?

RStudioに拡張機能を追加できる仕組みです。現在はRStudioのPreview版でしか利用できません。

以下の@u_riboさんの記事の解説が詳しいです。

公式ページはこちらです:

http://rstudio.github.io/rstudioaddins/

インストール

library(devtools)
install_github("yutannihilation/qiitaddin")

※ちなみにこのパッケージではRemotesを指定しているんですが、どうもこのバグのせいでdevtools::install_github()するとエラーが出るようです。上の例のようにlibrary(devtools)してからinstall_github()すれば問題ありません。

使い方

まず、knitしたいR Markdownファイルのエディタにフォーカスが当たっていることを確かめます。そしてAddinsメニューから「Post to Qiita」を選びます。

f:id:yutannihilation:20151226233220p:plain

するとR Markdownがknitされた結果のプレビューがポップアップで表示されます。「Done」というボタンを押すと↓のようにQiitaのAPIアクセストークンの入力を求めるポップアップが出ます。

f:id:yutannihilation:20151226233229p:plain:w450

「OK」を押すと、Qiitaに限定共有投稿(URLを知っている人しかアクセスできない投稿)としてアップロードされます。(「アップロード成功!」みたいな表示とかまったく出ないんですけど、エラーが出なければアップロードされてます。たぶん。)

タグはYAML front matterにtagsを指定すれば設定されます。この辺のメタデータはプレビュー時にもいじれるようにしたいんですけど、実装が追い付いていません。

やってること

ついでなので、作ったときに知ったことをメモっておきます。

rstudioapi::getActiveDocumentContext()

rstudioapiパッケージは、RStudio内部のAPIにアクセスするためのパッケージです。getActiveDocumentContext()は、現在フォーカスが当たっているペインの情報を取得します。例えば、コンソールで実行するとこんな感じの結果になります。

rstudioapi::getActiveDocumentContext()
#> Document Context: 
#> - id:        '#console'
#> - path:      ''
#> - contents:  <1 rows>
#> Document Selection:
#> - [1, 1] -- [1, 1]: ''

ドキュメントのID、パス(存在すれば)、中身、選択範囲が取得できます。今回作ったパッケージではこのpathrmarkdown::render()に渡しています。

shiny::includeMarkdown()

MarkdownのPreviewめんどくさいなーと思ってたんですが、これを使うとMarkdownをHTMLに変換してからインクルードしてくれます。便利。

Shiny力が圧倒的に足りないので、@hoxo_m親分が翻訳したチュートリアルをちゃんと読まないとなあと思う日々です。。

.rs.askForPassword()

前も書いたかもしれませんが、パスワードを入力する用のポップアップを出してくれる関数です。

これはどのパッケージのものでもなく、RStudioだけで利用可能な関数です。tools:rstudioという環境に属しているんですが、探してみると色々有用な関数があるかもしれません。

ls(as.environment("tools:rstudio"), all.names = TRUE)

感想

RStudioアドインに関してはまだまだ知見が少ないので、いろいろ手さぐりな感じがありました。もっと色々情報が溜まってきたころに再チャレンジしようと思います。