RStudioで気軽にLGTM

  • 9
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

みんな大好きRStudioの新しいPreview版 (v0.99.825) がリリースされました。いくつか新しい機能がありますが、中でも注目したいのは"RStudio Addins"です。

プロセスとしての一連の処理を実行することが実行できたり、インタラクティブにRオブジェクトの操作ができたりと、これまでにない新しい機能で楽しむことができそうです。詳しいことはRStudioの公式ページを見てもらうとして、今回はタイトルの通り、RStudioでLGTM画像を出力する、という話になります。

動作例

何はともあれこちらをご覧ください。

eNu7cjUZRe.gif

楽しいですね。

今回はShiny Gadgets として作成しました。RStudio Addinsを配布させるためにはパッケージとしてまとめることが必要ですが、単純に呼び出すだけなら次のコードをコピペして通常の関数の実行で済みます。LGTMしたくなった際にはぜひお試しください。

Rコード

# 必要なパッケージを読み込む
library(shiny)
library(shinygadgets)
library(rstudioaddins)
# 関数を定義する
rlgtm <- function(user = NULL, height = 400) {
  # 画像用に一時ファイルを作成
  tmpf <- tempfile()

  # LGTM画像のURLを取得
  #   ユーザー名を指定した場合、ユーザーのお気に入りからランダムにLGTM画像を表示
  image_url <- ifelse(is.null(user), "http://lgtm.in/g", paste("http://lgtm.in/g", user, sep = "/")) %>% 
    xml2::read_html() %>% 
    rvest::html_nodes(css = "form input") %>% 
    extract(1) %>%
    rvest::html_attr("value")
  image_ext <- tools::file_ext(image_url)

  # URLからファイルをダウンロード
  download.file(url      = image_url,
                destfile = paste(tmpf, image_ext, sep = "."),
                quiet    = TRUE)

  # 画像サイズを変更
  image <- paste(tmpf, image_ext, sep = ".") %>% 
    webshot::resize(paste0("x", height))

  # Shiny の部分
  ui <- imageOutput("image")
  server <- function(input, output, session) {
    output$image <- renderImage({
      list(src = image, height = height)
    })
  }
  # Viewerの起動。paneViewer()関数で出力時のviewerのサイズ(最低の高さ)を指定
  runGadget(ui, server, viewer = paneViewer(height))
}
# 関数の実行
rlgtm()

# ユーザー名を指定して実行
rlgtm(user = "uribo")

仕組み

簡単です。

  1. LGTM画像を http://lgtm.in から取得する。出力するLGTM画像はランダムに一枚表示してくれるページから選ぶようにする。

    • user引数により、GitHubのアカウントでお気に入りを登録している場合、そのユーザーのお気に入りから画像を表示する。
  2. webshot::resize()により画像のサイズ(高さ)を変更。初期値として400pxに設定。

    • この高さがviewerの高さ(paneViewer()でのminHeight引数になるので、viewerを小さくしていても拡大されるようになる。

スクリーンショット 2015-12-19 17.00.42.png

LGTM!