shiny + HTML

【本ページで体験できること】
  1. Shiny アプリの UI を、R のコードではなく手書きの HTML(www/index.html)で作る
  2. フォーム部品(テキスト、ファイル、チェックボックス、ラジオボタン)と Shiny の連携
  3. jQuery との連携(フォーム部品の色付け)
  4. networkD3 パッケージによるネットワークグラフの描画

前準備

前準備として、shiny パッケージをインストールしておくこと。

R システムで次のように操作する。

install.packages("shiny")

Shiny を使ってみる

Shiny アプリは、通常は R のコード(ui.R)で UI を定義するが、 アプリのディレクトリに www/index.html を置くと、手書きの HTML を UI として使うことができる。 HTML 側では、class 属性 shiny-html-output を持つ要素の id と、 server.R の output$〜 の名前を一致させることで、両者が結び付く。

◆ ヒント

フォームの種類

/tmp/www/index.html の次の部分を書き換えて実行してみる。

  <p>
    <input type="number" name="n" value="10" min="1" max="150" />
  </p>

◆ 考察のポイント

jQuery との連携

フォーム部品にフォーカスされたとき色付け

ネットワークグラフの描画 (networkD3 を使用)

tree や graph を HTML や SVG に描画する。 以前は d3Network パッケージを用いていたが、開発が終了しているため、 後継の networkD3 パッケージを用いる(D3.js の読み込みも自動で行われる)。

  1. インストール

    R システムで次のように操作する。

    install.packages("networkD3")
    
  2. 単体で使ってみる(HTML ファイルへの保存)
    library(networkD3)
    Source <- c("A", "A", "A", "A", "B", "B", "C", "C", "D")
    Target <- c("B", "C", "D", "J", "E", "F", "G", "H", "I")
    NetworkData <- data.frame(Source, Target)
    p <- simpleNetwork(NetworkData, height = 300, width = 700, fontSize = 15)
    p
    saveNetwork(p, file = "/tmp/hoge.html")
    
  3. Shiny と組み合わせて使ってみる

    /tmp/net/ui.R のサンプル

    library(shiny)
    library(networkD3)
    
    shinyUI(fluidPage(
    
        titlePanel('networkD3 Shiny Example'),
        p('This is an example of using',
          a(href = 'https://christophergandrud.github.io/networkD3/', 'networkD3'),
          'with',
          a(href = 'https://shiny.posit.co/', 'Shiny'), 'web apps.'
        ),
    
        sidebarLayout(
            sidebarPanel(
                sliderInput('slider', label = 'Choose node opacity',
                    min = 0, max = 1, step = 0.01, value = 0.5
                )
            ),
    
            mainPanel(
                forceNetworkOutput('networkPlot')
            )
        )
    ))
    

    /tmp/net/server.R のサンプル

    library(shiny)
    library(networkD3)
    
    # データの読み込み(networkD3 付属のサンプルデータ「レ・ミゼラブル」の登場人物の関係)
    data(MisLinks)
    data(MisNodes)
    
    shinyServer(function(input, output) {
    
        output$networkPlot <- renderForceNetwork({
            forceNetwork(Links = MisLinks,
                         Nodes = MisNodes,
                         Source = "source", Target = "target",
                         Value = "value", NodeID = "name",
                         Group = "group",
                         opacity = input$slider)
        })
    })
    
  4. 実行してみる

    R システムで次のように操作する。

    library(shiny)
    runApp("/tmp/net/")
    
  5. Web ブラウザで表示してみる

    スライダーを動かすと、ノードの不透明度が変わることを確認する。 ノードはマウスでドラッグできる。

◆ 考察のポイント

参考 Web ページ

https://shiny.posit.co/r/getstarted/

https://christophergandrud.github.io/networkD3/