本記事は、Shiny Advent Calendar 2018の17日目の記事です。
そして、Shiny100本ノックの第37弾です。
前回、Rコンソールから、GoogleのPageSpeed Insights APIを叩いてみました。
www.randpy.tokyo
今回は、本題のShinyアプリケーション作りに入ります。
アプリケーションの完成イメージ
まずは、どんなShinyアプリケーションを作るか、スクショで説明します。左の入力画面で、デバイス(モバイルかデスクトップか)を選択し、調べたいURLをカンマ区切りで入力して「結果を取得。」ボタンをクリックすることで、右側にデータテーブル形式で結果が表示されます。
画面は簡素ですが、shinythemesなどで装飾することで、すぐにそれっぽいアプリケーションになると思います。
www.randpy.tokyo
ソースコードを紹介
今回は、 PageSpeed Insights API を使うためのキーを別ファイルで管理したかったため、global.Rを用意しました。global.Rのソースコード
library(shiny) library(dplyr) library(httr) pagespeed_key <- "XXXXXXXXXXXXXXXXXXXXX" pagespeed_url <- "https://www.googleapis.com/pagespeedonline/v4/runPagespeed?url="
必要なライブラリとAPIを叩くためのURLをここで記述しています。なお、pagespeed_key には、前回取得したAPIキーを貼り付けてください。
ui.Rのソースコード
shinyUI(fluidPage( titlePanel("Old Faithful Geyser Data"), sidebarLayout( sidebarPanel( selectInput("device", "デバイス", c("mobile", "desktop")), textInput("urls_text", "カンマ区切りでURLを入力してください。", value = "http://www.randpy.tokyo/"), actionButton("get_result", "結果を取得。") ), mainPanel( DT::dataTableOutput("result_table") ) ) ))
既に以下の書籍などで、最低限の関数を学んだ方であれば特に説明はいらないかと思います。selectInput()で調べたいデバイスを選択し、textInput()で調べたいURLを入力させているだけです。
- 作者: 梅津雄一,中野貴広
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2018/11/07
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
server.Rのソースコード
shinyServer(function(input, output) { result <- eventReactive(input$get_result, { urls_split <- input$urls_text %>% strsplit(",") results <- c() for (i in 1:(urls_split[[1]] %>% length())){ request_url <- paste(pagespeed_url, gsub(" ", "", urls_split[[1]][i]), "&strategy=", input$device, "&key=", pagespeed_key, sep="") tmpresult <- GET(request_url) %>% content() results <- rbind(results, cbind(urls_split[[1]][i], tmpresult$ruleGroups$SPEED$score)) } return(results) }) output$result_table <- DT::renderDataTable({ result() }) })
前編と同様に、GET()関数を使って結果を取得しています。その前に、以下部分で、textInput()からカンマ区切りで取得されたURL情報から、URLのリストを作っています。
urls_split <- input$urls_text %>% strsplit(",")
まとめ
今回は、Google PageSpeed Insights API をShinyから呼んで簡単なアプリケーションを作成してみました。GET()関数を使うだけなので、非常に簡単ですね。これだけだと、ちょっと簡単すぎるので、次回は結果をダウンロードできるアプリケーションを作成してみましょう。