Edited at

RStudioで気軽にLGTM

More than 3 years have passed since last update.

みんな大好き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!