Np-Urのデータ分析教室

オーブンソースデータなどWeb上から入手できるデータを用いて、RとPython両方使って分析した結果を書いていきます

【R Shiny 小技】便利なDT::renderDataTableのオプション・拡張機能を使いこなす

Shiny Advent Calendar 2018の13日目の記事です。



本記事は、2018年2月に投稿したものを、アドベントカレンダー用に修正と追記を行ったものです。そして、Shiny100本ノック第25弾です。
今回は、データテーブルを表示する機能の、DT::renderDataTableメソッドの紹介をします。

DT::renderDataTableメソッドは、本ブログでも以下の記事にて登場しました。
www.randpy.tokyo
www.randpy.tokyo

いくつか便利なオプション・拡張機能があるので、是非使いこなせるようになりましょう!

DT::renderDataTableの基本的な使い方

まずは、シンプルなコードで基本的な使い方を確認します。

server.R

まずはserver.Rから。皆さん大好きのirisデータを読み込んでいます。

library(shiny)
library(DT)

shinyServer(function(input, output) {
  output$table = DT::renderDataTable(iris)
})

ui.R

続いてui.R。server.Rから渡されたtableという変数を元に、「DT::dataTableOutput」してあげれば完了です。

library(shiny)
library(DT)

shinyUI(fluidPage(
  titlePanel("DT::renderDataTable"),
  DT::dataTableOutput("table")
))

サンプルコードのイメージ

上のコードを実行すると、以下のような画面が表示されるかと思います。
f:id:Np-Ur:20180221083015p:plain

見てわかる通り、検索窓から検索ができますし、表示する件数も変えられます。またある列に沿って昇順・降順といった表示に変更することもできます。
この時点ですでに便利!

DT::renderDataTableの応用編を紹介

さて、前節で基本形を確認しましたので、ここから本題のオプション・拡張機能を紹介していきます。

表示する行数を変更する

デフォルトでは、表示する件数は「10・25・50・100」から選ぶことができます。
しかし、この件数をデータによっては「5・10・20」などに柔軟に変えたいという場合もあるかと思います。

その場合は、opitionsにlengthMenu とpageLength を指定してあげます。

server.Rの変更箇所

library(shiny)
library(DT)

shinyServer(function(input, output) {
  output$table = DT::renderDataTable(iris, options= list(lengthMenu = c(5, 10, 20), pageLength = 5))
})

lengthMenuにて選択できる件数、またpageLenghで最初に表示される件数を指定します。
アプリを更新して、変更されているか確認してみましょう!

テーブルをスクロールできるようにする

一度に表示できる件数は増やしたいけど、画面幅の都合上表示が難しい、という場合はテーブル自体をスクロールできるようにしましょう。
先ほどと同様optionsに設定を追加します。

縦方向にスクロールする場合は、scrollCollapse = TRUEとし、表示する幅をscrollY = "200px"のように指定すればOKです。

server.Rの変更箇所

library(shiny)
library(DT)

shinyServer(function(input, output) {
  output$table = DT::renderDataTable(iris, 
                                     options = list(lengthMenu = c(5, 10, 20),
                                                    pageLength = 5, 
                                                    scrollY = "200px",
                                                    scrollCollapse = TRUE))
})


表示したい画面幅に応じて、scrollY の値を変えてみましょう。
同じく横方向のスクロールも可能ですので、試してください。

完成イメージ

上のコードを元にShinyアプリを立ち上げてみましょう。
f:id:Np-Ur:20180221131828p:plain

テーブルの右側にスクロールバーが出現しています!

ダウンロードボタンを設置

Shiny上で色々操作したテーブルを手元にダウンロードしたい、ということもあるかと思います。
そんなときは、ダウンロードボタンを設置しましょう。

拡張機能の一つのBottonsにて設定可能です。

server.Rの変更箇所

library(shiny)
library(DT)

shinyServer(function(input, output) {
  output$table = DT::renderDataTable(iris, 
                                     extensions = c('Buttons'), 
                                     options = list(lengthMenu = c(5, 10, 20),
                                                    dom = 'Blfrtip',
                                                    pageLength = 5, 
                                                    buttons = c('csv', 'excel', 'pdf')))
})

extensionsに'Buttons'を指定し、ボタンが表示されるように同時にdomも指定します。(参考:dom

buttons にはダウンロード形式を用意します。
他に設定できる形式には、copy(クリップボードにコピー)、print(印刷プレビュー画面に移動)があります。

完成イメージ

上のコードを元にShinyアプリを立ち上げてみましょう。
f:id:Np-Ur:20180221125411p:plain

画面上部に、

  • CSV
  • Excel
  • PDF

ボタンが出現しました。
これらをクリックして、希望のファイルがダウンロードできているか確認してみましょう。

まとめ

今回は、DT::renderDataTableメソッドのオプション・拡張機能を紹介しました。
テーブル表示を行う際は是非使い倒して、便利なShinyアプリケーションを作ってみてください!

執筆にあたって、DTについて色々調べてみたのですが、まだまだ多くの拡張ができそうです。
今後も機会があればまとめていこうと思います!