Lesson4 – reactive 出力の表示

Shiny アプリに「「ライブ」特性を持たせて行きましょう! このレッスンでは、Shiny アプリへ reactive(反応)出力を作成する方法を学びます。reactive 出力は、ユーザがウィジェットをトグルしたときに自動的に応答するものです。

このレッスンを終了したときには、2 つの reactive なテキスト行を持つシンプルな Shiny アプリケーションを作成する方法を理解していることでしょう。 各行には、ユーザの入力に基づき、ウィジェットの値が表示されます。
この新規の Shiny アプリケーションには、新しいディレクトリが必要です。 作業ディレクトリに、census-app という名前のフォルダを作成してください。 ここには、このレッスンで作成した app.R ファイルを保存します。

2つのステップ

2 段階のプロセスで reactive 出力を作成できます。

  • ユーザ・インターフェイスに R オブジェクトを追加する。
  • サーバ関数内で、Shiny にオブジェクトを構築する方法を命令する。 オブジェクトを構築するコードがウィジェット値を呼び出す場合、オブジェクトは reactive になりる。

ステップ 1:UI に R オブジェクトを追加する

Shiny は、R オブジェクトをユーザ・インターフェイスの出力に変換する関数のファミリを提供します。各関数は、特定のタイプの出力を作成します。

出力関数 作成
dataTableOutput データテーブル
htmlOutput HTML そのもの
imageOutput 画像
plotOutput プロット
tableOutput テーブル
textOutput テキスト
uiOutput HTML そのもの
verbatimTextOutput テキスト

HTML 要素とウィジェットを追加した場合と同じ方法で、ユーザインターフェイスに出力を追加できます。output 関数を、ui の sidebarPanel または mainPanel の中​​に配置します。

例えば、下の ui オブジェクトは textOutput を使用して、上の Shiny アプリの main パネルに reactive なテキスト行を追加します。

textOutput の引数には、文字列 “selected_var” が指定されていることに注意してください。各 Output 関数には、Shiny が reactive 要素の名前として使用する文字列の引数が 1 つ必要です。ユーザにはこの名前は見えませんが、後程これを使用します。

ステップ 2: オブジェクトを構築するための R コードを指定する

ui に関数を配置して、オブジェクトをどこに表示するかを Shiny に指示します。次に、Shiny にオブジェクトの構築方法を命じる必要があります。

これを行うため、サーバ関数内にオブジェクトを構築する R コードを指定します。

サーバ関数は Shiny プロセスで特別な役割を果たします。それは、アプリ内の R オブジェクトの更新に必要な、すべてのコードを含んだ output という名前の、リストのようなオブジェクトを作成します。各 R オブジェクトは、リスト内にエントリを持つ必要があります。

下のように、サーバ関数において output のための新しい要素を定義することによって、エントリを作成することができます。要素名は、ui で作成した reactive 要素の名前と一致する必要があります。

下のサーバ関数では、output$selected_var が ui の textOutput(“selected_var”) に一致します。

サーバ関数では、コードの最後行に出力の return を記述する必要はありません。R は、reference クラスのセマンティクスを通じて出力を自動的に更新します。

出力する各エントリには、Shiny の render* 関数の 1 つの出力が含まれていなければなりません。これらの関数は、R 式をキャプチャし、その式に対して軽い事前処理を行います。作成中の reactive オブジェクトに対応するタイプの render* 関数を使用します。

render 関数 作成
renderDataTable データテーブル
renderImage 画像 (ソースファイルへのリンクとして保存される)
renderPlot プロット
renderPrint 印刷出力
renderTable データフレーム、行列、他のテーブルのような構造
renderText 文字列
renderUI Shiny タグオブジェクトまたは HTML

各 render* 関数は、引数を 1 つとります。R の式は波括弧 {} で囲みます。式は、単純な 1 行のテキストにすることも、複雑な関数呼び出しのような多数の行のコードにすることもできます。

この R の式を、後で Shiny に指定するための命令の集合と考えてください。 Shiny は、最初にアプリを起動したときに命令を実行し、その後、Shiny はオブジェクトを更新する必要があるたびに命令を再実行します。

これが機能するには、式はオブジェクト(テキスト、プロット、データフレームなど)を返さなけれなりません。式がオブジェクトを返さない場合や、間違ったタイプのオブジェクトを返す場合は、エラーになります。

ウィジェット値を使用する

上のサーバ関数でアプリを実行すると、メインパネルに “You have selected this” と表示されます。ただし、テキストは反応(reactive)しません。アプリのウィジェットを操作しても変更されません。

テキストを作成するときに、ウィジェットの値を呼び出すよう Shiny へ指示することで、テキストを reactive にすることができます。この方法を見てみましょう。

サーバ関数の先頭行のコードを見てください。サーバ関数に 2 つの引数、input と output という名称が指定されていることに気づきましたか? output は、アプリにおける R オブジェクトを構築するための命令を格納する、リストのようなオブジェクトであることは既に説明しました。

input は、リストのような 2つ目のオブジェクトです。アプリ内の、全ウィジェットの現在値を格納します。これらの値は、ui のウィジェットに付けた名前の下に保存されます。

従って、例えば、アプリに 2 つのウィジェットがあり、1つは “var”、もう 1 つは “range” であった(これらの名前は、Lesson 3 でウィジェットに付けたものです)とすると、”var” と “range” の値は、input$varと input$range として保存されます。スライダ・ウィジェットには2つの値(min と a max)があるので、input$range には長さ 2 のベクトルが含まれます。

オブジェクトが入力値を使用する場合、Shiny はオブジェクトを自動的に reactive にします。例えば、下のサーバ関数は、テキストの構成に選択ボックスウィジェットの値を呼び出して、reactive なテキスト行を作成します。

Shiny は、どの output がどのウィジェットに依存しているかを追跡します。ユーザがウィジェットを変更すると、Shiny はそのウィジェットの新しい値を使用して、ウィジェットに依存するすべての output を再構築します。その結果、再構築されたオブジェクトは完全に最新の状態になります。

これは、output のオブジェクトへ input の値を接続することによって、Shiny による reactive を作り出す方法です。Shiny は、他のすべての細部の処理をします。

アプリを起動し reactive 出力を確認

準備ができたら、上と一致するようにサーバと ui 関数を更新してください。 次に、コマンドラインで runApp(“census-app”, display.mode = “showcase”) を実行して Shiny アプリケーションを起動します。あなたのアプリは,下のアプリのように見えるはずです。また、選択ボックス・ウィジェットを変更すると、そのステートメントはすぐに更新されるでしょう。

スクリプトのサーバ部分を見てください。 Shiny は、output を再構築するときに、実行中のコードをハイライト表示します。 この一時的なハイライトは、Shiny がどのように reactive な output を生成するかを見るのに役立ちます。

やってみよう

Shiny アプリの main パネルに、2 行目の reactive テキストを追加してください。この行には、“You have chosen a range that goes from something to something” と表示し、something にはスライダ・ウィジェットの現在の最小値(min)または最大値(max)を表示します。

ui オブジェクトとサーバ関数の両方を忘れないで更新してください。

モデル解答

Reveal answer
最初の行を追加したときと同じ方法で、2行目のテキストを追加します。 ui で textOutput を使用して、メインパネルに2行目のテキストを配置します。 サーバで renderText を使用して、Shiny にテキストの構成方法を指示します。テキストに使用する 2 つの値をを参照するには、スクリプトでは同じ名前(”min_max” など)を使用する必要があります。

テキストには、スライダの最小値(input$range[1] として保存されたもの)と最大値(input$range[2] として保存されたもの)の両方を使用する必要があります。

入力値を output オブジェクトに接続しただけで、テキストは reactive になることに注意してください。 Shiny は、これらの接続を認識すると自動的に reactive 性を作り出します。

まとめ

このレッスンでは、最初の reactive な Shiny アプリケーションを作成しました。その過程で、次のことを学びました

    • Shiny アプリに reactive のオブジェクトを配置するため、ui 内で *Output 関数を使用し、
    • Shiny にオブジェクトの構築方法を伝えるため、サーバで render* 関数を使用し、
    • 各 render* 関数内で R の式を波括弧 {} で囲み、
    • render* 式を output リストに保存し、アプリ内の reactive オブジェクトごとに1つのエントリを追加し、
    • render* 式に input 値を指定することによって reactivite 性を作成します。

これらのルールに従えば、Shiny は自動的にオブジェクトを reactive にします。

Lesson 5 では、R スクリプトと外部データに依存するより洗練された reactive なアプリケーションを作成します。

Lesson5 へ

Lesson3 – コントロール・ウィジェットの追加

このレッスンでは、Shiny アプリケーションへのコントロール・ウィジェットの追加方法を説明します。 ウィジェットとは、ユーザが操作できる Web 要素です。 ウィジェットは、ユーザが Shiny アプリにメッセージを送信するための方法を提供します。

Shiny ウィジェットは、ユーザから値を収集します。 ユーザがウィジェットを変更すると、値も変更されます。 これは Lesson 4 で説明します。

コントロール・ウィジェット

Shiny には、予め作成されたウィジェットのファミリが付属しています。それぞれのウィジェットは、透過的に名付けられた R 関数で作成されています。例えば、Shiny には、Action ボタンとスライダ・バーを作成する sliderInput という名前の関数を作成する、actionButton という名前の関数が用意されています。

標準的な Shiny ウィジェットは次の通りです:

関数 ウィジェット
actionButton アクション・ボタン
checkboxGroupInput チェックボックスのグループ
checkboxInput 単独のチェックボックス
dateInput 日付入力を手助けするカレンダ
dateRangeInput 日付の範囲を入力するためのカレンダのペア
fileInput ファイルアップロード用のコントロール・ウィザード
helpText 入力フォームに追加できるヘルプ・テキスト
numericInput 数値入力用のフィールド
radioButtons 一組のラジオボタン
selectInput 選択ボックス
sliderInput スライダ・バー
submitButton 送信ボタン
textInput テキスト入力用のフィールド

これらのウィジェットの一部は、Twitter Bootstrap プロジェクトを使用して作られています。Twitter Bootstrap は、ユーザ・インターフェイス構築に人気のあるオープンソース・フレームワークです。

ウィジェットの追加

Lesson 2 で他のタイプの HTML コンテンツを追加したのと同じ方法で、Web ページにウィジェットを追加できます。ウィジェットをアプリケーションに追加するには、 ui オブジェクトの sidebarPanel または mainPanel にウィジェット関数を配置します。

各ウィジェット関数にはいくつかの引数が必要です。各ウィジェットの最初の 2 つの引数は次の通りです。

  • ウィジェットの名前:この名前はユーザには見えませんが、ウィジェットの値にアクセスするために使用できます。名前は文字列でなければなりません
  • ラベル:このラベルはウィジェットと共にアプリへ表示されます。文字列でなければなりませんが、空の文字列 “” にすることができます

名前が “action” で、ラベルが “Action” の場合:

残りの引数は、ウィジェットが何をするかによって異なります。初期値、範囲、増分値などが含まれます。ウィジェットが必要とする引数については、ウィジェット関数のヘルプページ(例:?selectInput)を見てください。

下の app.R スクリプトは、上図のアプリを作成します。それに一致するようあなたの App-1/app.R スクリプトを変更し、アプリを起動してください(runApp(“App-1”)、Run App、ショートカットの何れかを使用します)。

各ウィジェットを操作して、何ができるかを感じ取ってください。ウィジェット関数の値を変更して、その効果を観察してください。この Shiny アプリのレイアウトスキームに興味がある場合は、アプリケーションレイアウト・ガイドの説明を読んでください。このレッスンでは、この複雑なレイアウトスキームは扱いませんが、それが何をしているのかに興味があります。

やってみよう

あなたの ui を書き換えて、下に表示されているユーザインターフェイスを作成してください。 この Shiny アプリは、基本的な Shiny レイアウト(列なし)を使用し、上に描かれた3つのウィジェットを含んでいることに注意してください。 選択ボックスのその他の値は、アプリ画像の下に表示されています。

モデル解答

Reveal answer

まとめ

Shiny アプリに完全な関数ウィジェットを追加するのは簡単です。

Shiny は、これらのウィジェットを作成するための関数のファミリを提供します。

各関数には名前とラベルが必要です。

ウィジェットの中には、機能を実現するために特定な指示が必要なものがあります。

他のタイプの HTML コンテンツを追加したのと同様に、Shiny アプリケーションにウィジェットを追加します(Lesson 2 参照)

その他

The Shiny Widgets Gallery には、Shinyアプリケーションへ手早くウィジェットを追加するためのテンプレートが用意されています。

テンプレートを使用するには、ギャラリに訪問してください。 ギャラリには Shiny の各ウィジェットが表示されています。各ウィジェットが、入力に応じて値がどのように変化するかが見られます。


参照したいウィジェットを選択し、ウィジェットの下の “See Code” ボタンをクリックします。 ギャラリはウィジェットを説明するサンプル・アプリケーションに移動します。 ウィジェットを使用するには、サンプルの app.R ファイルのコードをコピーして、あなたの app.R ファイルに貼り付けます。

Lesson 4 では、ユーザがウィジェットを変更するたびに更新されるオブジェクトの、reactive 出力にウィジェットを接続する方法を学習します。

Lesson4 へ

Lesson2 – ユーザインタフェースの作成

Shiny アプリの構造を Lesson 1 で説明しましたので、ここではゼロから最初のアプリを作成していきます。

このレッスンは、アプリに対するユーザ・インターフェイスの作成方法を説明するものです。ここでは、ユーザ・インターフェイスをレイアウト方法を学習すると共に、テキスト、画像、その他の HTML 要素を Shiny アプに追加していきます。

Lesson 1 で作成した App-1 アプリと同じものを作成します。先ず、app.R ファイルを開き、以下のスクリプトと同じになるようにスクリプトを編集してください:

このコードは、Shiny アプリを作成するのに必要な最小限のものです。 結果は、このレッスンの出発点として適切な、ユーザ・インターフェイスのない空のアプリケーションです。

レイアウト

Shiny は、関数 fluidPage を使用して、ユーザのブラウザ・ウィンドウと同じサイズになるよう自動的に表示領域を調節します。 fluidPage 関数に要素を配置することで、アプリケーションのユーザーインターフェイスをレイアウトします。

例えば以下の ui 関数は、titlePanel と、sidebarPanel と mainPanel 含む sidebarLayout を持つユーザーインターフェイスを作成しています。 これらの要素を、fluidPage 関数内に配置していることに注意してください。

titlePanel と sidebarLayout は、fluidPage に追加するための最も一般的な 2 要素です。これにより、サイドバーを持つ基本的な Shiny アプリが作られます。

sidebarLayoutは常に2つの引数をとります:

  • sidebarPanel 関数の出力
  • mainPanel 関数の出力

これらの関数は、sidebar または main パネルの何れかにコンテンツに配置します。

sidebar パネルは、デフォルトではアプリの左側に表示されます。sidebarLayout へ、オプションの引数 position = “right” を指定れば右側に移動することができます。

titlePanel と sidebarLayout は、Shiny アプリの基本レイアウトを作成しますが、さらに高度なレイアウトを作成することもできます。例えば、navbarPage を使用することで、ナビゲーションバーを含む複数ページのユーザ・インターフェイスをアプリに設定することができます。 また、fluidRow と column を使用することで、グリッドシステムからレイアウトを構成することもできます。これらの高度なオプションの詳細については、Shiny Application Layout Guide をご覧ください。 このチュートリアルでは、sidebarLayout を使用します。

HTMLコンテンツ

Panel 関数の中に配置することで、Shiny アプリにコンテンツを追加することができます。例えば、上のアプリでは、それぞれのパネルに文字列を表示しています。 sidebarPanel 関数に文字列を追加している(sidebarPanel(“sidebar panel”))ので、サイドバーパネルには “sidebar panel” という文字が表示されています。title パネルと main パネルのテキストについても同様です。

更に高度なコンテンツを追加するには、Shiny の HTML タグ関数を使用します。 これらの関数は、一般的な HTML5 のタグに対応しています。それらのうちのいくつかを試してみましょう。

shiny 関数 HTML5 作成
p <p> パラグラフ
h1 <h1> h1 ヘッダ
h2 <h2> h2 ヘッダ
h3 <h3> h3 ヘッダ
h4 <h4> h4 ヘッダ
h5 <h5> h5 ヘッダ
h6 <h6> h6 ヘッダ
a <a> リンク
br <br> 改行
div <div> ブロックレベル要素としてグループ化する
span <span> インライン要素としてグループ化する
pre <pre> テキストを固定幅フォントでそのまま表示する
code <code> フォーマットされたコードブロック
img <img> 画像
strong <strong> 太字のテキスト
em <em> イタリック体のテキスト
HTML HTML コードとして直接文字列を渡す

ヘッダ

ヘッダ要素を作成するには:

  • ヘッダ関数(例えば、h1 や h5 など)を選択し
  • ヘッダに表示するテキストを指定する

例えば、h1(“My title”) で “My title” という第1レベルのヘッダを作成することができます。 コマンドラインで次のコマンドを実行すると、HTML コードが作られることが分かります。

アプリ内に要素を配置するには:

  • titlePanel、sidebarPanel、または mainPanel の引数として h1(“My title”) を渡します

テキストは、Webページの対応するパネルに表示されます。 コンマで区切ることで複数の要素を同じパネルに配置することができます。

これを試してみてください。 以下の新しいスクリプトでは、6種類のレベルのヘッダをすべて使用しています。あなたの app.R をスクリプトと同じになるよう更新してから、runApp(“App-1”) を実行するか、Run App ボタンをクリックするか、キーボードショートカットを使用して Shiny アプリを再起動してください。

現在、あなたのアプリは次のようになっているはずです。


もしGeorge Lucas の最初のアプリであれば、それは次のようになっているかもしれません。

このエフェクトは、h6(“Episode IV”, align = “center”) のように、align = “center” で作成できます。 一般に、HTML タグ属性は Shiny タグ関数の引数として設定できます。

HTML タグの属性に精通していない場合は、w3schools などの多くの無料オンライン HTML リソースで属性を調べることができます。

スターウォーズにインスパイアされたユーザーインターフェイスの ui のコードは次の通りです:

書式付きテキスト

Shiny は、テキストに書式を設定するための多くのタグ関数を提供しています。これを理解する最も簡単な方法は、例を実行してみることです。

下の ui オブジェクトを app.R ファイルに貼り付けて保存してください。Shiny アプリがまだ動作しているなら、Webページやプレビューウィンドウを更新すれば変更を表示することができます。 アプリを閉じている場合は、再起動してください。

表示されたアプリと変更した ui オブジェクト定義を比較し、Shiny アプリにおけるテキストの書式設定方法を調べてください。

画像

画像は、アプリの外観を向上させるとともに、コンテンツを理解し易くします。 Shiny は、アプリに画像ファイルを配置するため img 関数を使用します。

画像を挿入するには、img 関数に src 引数として画像ファイル名を 指定します(例:img(src = “my_image.png”))。img は、入力を HTML タグに渡し、src はタグが要求するものなので、この引数は一字一句正確に記述しなければなりません。

height や width などの HTML に馴染みのパラメータを含めることもできます。height や width の数値はピクセル値ですので注意してください。

img 関数は、指定の場所から画像ファイルを検索します。ファイルは、app.R スクリプトと同じディレクトリにある www という名前のフォルダになければなりません。Shiny は、このディレクトリを特別な方法で扱います。 Shiny は、ここに置かれた全てのファイルを、ユーザの Web ブラウザと共有します。この www は、Shiny アプリの web コンポーネントを構築するのに必要な、画像、CSS、およびその他のものを格納する重要な場所です。

従って、rstudio.png という名前の画像を使用する場合、App-1 ディレクトリは次のようになります:

このファイル配置により、下の ui オブジェクトで図のようなアプリが作成できます。 rstudio.png をここからダウンロードして試してみてください。

その他のタグ

このレッスンでは、最も一般的な Shiny タグ関数についてのみ説明しましたが、もっと多くのタグ関数が使用できます。他のタグ関数については、「HTMLでUIをカスタマイズする」と「Shiny HTML タグ用語集」を参照してください。

やってみよう

Shiny のレイアウトや HTML、img 関数を使用すると、非常に魅力的で有用なユーザーインターフェイスを作成できます。 下の画像の Shiny アプリを再現して、これらの機能をどれくらい理解しているかを確認してください。 このチュートリアルの例を使用しながら、作成とテストをしてみてください。

答えは Model Answer ボタンの下にありますが、コピーして貼り付けるだけではダメです。次に行く前に、コードを理解しているどうかを確認してください。

モデル解答

Reveal answer

まとめ

新しいスキルにより、次のことが行えます:

  • fluidPage、titlePanel、sidebarLayout を使用してユーザーインターフェイスを作成する
  • Shiny タグ関数の 1 つを使用して HTML 要素を作成する
  • 各タグ関数の引数に HTML タグ属性を設定する
  • titlePanel や sidebarPanel または mainPanel に要素を渡すことで、Webページに要素を追加する
  • カンマで区切り、複数要素を各パネルに追加する
  • Shiny アプリ・ディレクトリ内の www フォルダに画像を配置し、img 関数を呼び出すことで画像を追加する

これで簡単なコンテンツをユーザーインターフェイスに配置できるようになりましたので、ウィジェットなどの複雑なコンテンツをどのように配置するかを見てみましょう。 ウィジェットは、ユーザーがアプリケーションを制御するために使用できるインタラクティブな Web 要素です。これは Lesson 3 の主題でもあります。

Lesson3 へ

Lesson1 – Shiny へようこそ

Shiny へようこそ

Shinyは、Rから直接的にインタラクティブなWebアプリケーション(app)を簡単に構築できるRパッケージです。このレッスンは、Shinyアプリをすぐに作れるようにするためのものです。

Shinyパッケージをまだインストールしていない場合は、R から次を実行してください



Shinyパッケージには、Shinyがどのように動作するかを説明する11個の組込みのサンプルがあります。それぞれの例は、組込みのShinyアプリケーションです。

一つ目の例であるHello Shinyは、R に同梱された faithful データセットをプロットするもので、ビン(階級)数の変更を行えるようスライダーバーが付けられ、その変更に即座に応答するようになっています。このHello Shinyを通して Shiny アプリの構造を探ると共に、最初のアプリを作成していきます。

Hello Shinyを実行するには、次のように入力します:

Shiny アプリの構造

Shiny アプリには、app.R という1つのスクリプトに含まれます。スクリプト app.R が、例えばディレクトリ newdir/ にあった場合、app は runApp(“newdir”) で実行することができます。

app.R は3つのコンポーネントから構成されています:

  • ユーザインタフェース(ui)オブジェクト
  • サーバ関数
  • shinyApp 関数の呼び出し

ユーザインターフェイス(ui)オブジェクトは、アプリケーションのレイアウトと外観を制御します。サーバ関数には、コンピュータがアプリケーションを構築するために必要な命令が含まれています。最後の shinyApp 関数は、明示的な UI/server のペアから Shiny アプリケーションオブジェクトを作成します。

注意:バージョン 0.10.2 以前のバージョンでは、Shiny は単一ファイルでのアプリケーションがサポートされていなかったため、ui オブジェクトとサーバ関数をそれぞれ ui.R と server.R という別々のスクリプトに入れる必要がありました。この機能は、Shiny では未だにサポートされていますが、チュートリアルやサポート文書の多くは単一ファイルのアプリケーションが中心になっています。

単一ファイルアプリケーションの優れている点の1つは、アプリ全体をコピーして R コンソールに貼り付けることができるため、他のユーザが試したいコードを簡単に共有できることです。例えば、上のコードをコピーして R のコマンドラインに貼り付けると、Shiny アプリケーションを実行することができます。

ui.R

例で示した Hello Shiny の ui オブジェクトは次の通りです。

server.R

Hello Shiny のサーバ関数は次の通りです。

Hello Shiny のサーバ関数は非常に単純です。 スクリプトはいくつかの計算を行い、要求されたビン数のヒストグラムをプロットします。

しかし、注目してほしいのは、プロットを生成しているコードが renderPlot という関数にラップされているということです。関数の上のコメントに、そのことを少しだけ説明しています。もし今の段階で分からなくても安心してください。この概念については間もなく詳細に説明します。

Hello Shiny アプリに触れてみて、ソースコードを再確認してください。アプリがどう動くのか、その感覚を発展させてみてください。 しかし、そうする前に、app.R ファイルの中は、Shiny パッケージのロードで始まり、shinyApp の呼び出しで終了する必要があります:

Hello Shiny アプリが動いている間は、R セッションがビジー状態になり、それ以外の R コマンドを実行することはできなくなります。R は、アプリとアプリのリアクションの実行を監視しているのです。R セッションのビジー状態から元に戻るには、エスケープキー(Esc)を押すか、RStudio のコンソールパネルの右上にある赤いストップアイコンをクリックして下さい。

アプリの実行

Shiny アプリケーションは、全て ui と server を含む app.R ファイルという同じ構造をしています。 Shiny アプリケーションを作成するには、新しいディレクトリを作成し、そこに app.R ファイルを保存します。 各アプリは独自のディレクトリに置くことをお勧めします。

runApp 関数に、先程のディレクトリ名を指定することで、Shiny アプリケーションを実行することができます。例えば、Shiny アプリケーションが my_app というディレクトリにある場合は、次のコードで実行します:

注:runApp は、R の read.csv や read.table などのその他の多くの関数に似ています。runApp の最初の引数は、作業ディレクトリからアプリケーションのディレクトリまでのファイルパスです。 上のコードでは、app のディレクトリが作業ディレクトリにあると想定しています。 この場合、ファイルパスは単なるディレクトリ名になってしまいます。

(上のケースで不思議に思われるかもしれませんが、Hello Shiny アプリのファイルは “01_hello” という特別なシステムディレクトリに保存されています。このディレクトリは、runExample (“01_hello”) で動作するように設計されています。)

やってみよう

作業ディレクトリに App-1 という名前の新しいディレクトリを作成します。 次のソースをコピーし、R studio の script に貼り付け App-1 ディレクトリに app.R と言う名前で保存してください。

作業を完了すると、ディレクトリは次のようになります。

コンソールに runApp(“App-1”) を入力してアプリを起動します。起動を確認したら、エスケープをクリックして、アプリにいくつかの変更を加えてみましょう:

  • タイトルを “Hello Shiny!” から “Hello World!” に。
  • スライダバーの最小値を5に。
  • ヒストグラムのボーダーの色を “white” から “orange” に。

準備ができたら、アプリをもう一度起動します。 新しいアプリは下の画像と一致する必要があります。一致していない場合やコードを確認したい場合は、下記「モデルの解答」の Reveal answer ボタンを押せば、これらのタスクにどう対処したかをご覧いただけます。

デフォルトでは、Shiny アプリは上のアプリのように “normal” モードで表示されます。Hello Shiny やその他の組込みの例は “showcase mode” で、別のモードでは app.R スクリプトをアプリケーションの横に表示します。

あなたのアプリを showcase モードで表示したい場合は、runApp(“App-1”, display.mode = “showcase”) を実行します。

モデル解答

Reveal answer

アプリの再起動

Shiny アプリの起動には、もう一つの方法があります。runApp(“App-1”) を実行する方法の他に、RStudio の機能を使う方法があります。app.R を RStudio で開くと、Shiny 用のファイルを開いたことを RStudio が認識し、Run App ボタンをエディタの右上に表示します。そのボタンをクリックするか、キーボードショートカットの Command+Shift+Enter(Mac)か Control+Shift+Enter(Windows)を使用して起動します。

RStudio は、デフォルトで新しいウィンドウに結果を表示しますが、専用のビューアまたは外部のWebブラウザに表示するように選択することもできます。 [Run App]の横にあるアイコンをクリックして選択してください。

まとめ

独自の Shiny アプリを作成するには:

  • アプリケーション用に myapp/ という名前のディレクトリを作ります。
  • そのディレクトリ内に app.R スクリプトを保存します。
  • runApp か RStudio のキーボードショートカットを使用してアプリケーションを起動します。
  • エスケープを押下して Shiny アプリを終了します。

その他のアプリ

既存の Shiny アプリケーションをコピーして変更することで、Shiny アプリケーションを作成することができます。Shiny ギャラリには、いくつかの良い例があります。下にリストしている11種類の Shiny の例を使用してみてください。

上の例のそれぞれが Shiny アプリの機能を示しています。 すべての Shiny サンプルアプリケーションは、 “showcase”モードで表示されます(app.R スクリプトが表示されます)。

しかし、なぜ他のアプリをコピーすることに制限しているのですか? 次のいくつかのレッスンでは、独自の Shiny アプリケーションをゼロから構築する方法を紹介しています。Shiny アプリの各部分について学び、自分の Shiny アプリをオンラインに展開(deploy)することで完了します。

準備ができたら、Lesson 2 に進みます。Lesson 2 では、Shinyアプリケーションのレイアウトと外観を作成する方法を学習します。

Lesson2 へ

Shiny チュートリアル

Shiny チュートリアル

このページは、Shinyのチュートリアルを勉強を兼ね自分用に翻訳したものです。もし不幸にも、このページを検索してしまった方は、訳出の誤りや不備があっても責任を負いかねますので、その点をご理解の上ご覧ください。

目次

  • Lesson 1 – Shiny へようこそ
  • Lesson 2 – ユーザインタフェース(ui)のレイアウト
  • Lesson 3 – コントロール・ウィジェットの追加
  • Lesson 4 – reactive 出力の表示
  • Lesson 5 – R スクリプトとデータの使用
  • Lesson 6 – reactive 式の使用
  • Lesson 7 – app の共有

都道府県境界データの取得

地図描画に使用する都道府県境界データ(ShapeFile)は、次の2つのサイトから取得できる。

1. 国土地理院

(1) GIS ホームページ
(2) データ形式:GML(JPGIS2.1)シェープファイル・・・デフォルトで選択されている
→ 2.政策区域行政区域 を選択
(3) データダウンロードの画面が表示されるので、必要な全国、または都道府県を選択して、「次へ」をクリック
(4) その後、測量した年度を指定し、アンケートに答え、利用約款に同意することでダウンロードが可能になる。

2. e-Stat(政府統計の総合窓口)

(1) e-Stat ホームページ
(2) トップメニューの「地図で見る」をクリック→「境界データダウンロード
(3) 「小地域」→「国勢調査」→「2015年」(2015,2010,2005,2000年のいずれか)
(4) 「町丁・字等別」→「世界測地系緯度経度・Shape形式
(5) 都道府県選択画面が表示されるので、必要なデータをダウンロードする

ggplot2 development version をインストール

ggplot2 による地図を描画するため、現バージョンにバンドルされていない geom_sf() が必要なので、development version をインストールしたい。方法は、こちらに記述されているが、R console から次のコマンドを実行する。

ところが、これがうまく行かない。
途中、2回もRtoolsのインストールが走り、延々処理した揚句の失敗が痛い!
一旦は、インストールを諦めたものの、どうしても欲しい物は欲しいのである。

思い直し、Rtoolsの何たるかものかを調べることから再開。
Rtoolsとは、Windows 環境でパーッケージをソースからインストールする際に
「C++でコンパイルするため,C++コンパイラが必要で,WindowsではRtoolsを使う」
とのこと。

Rtoolsのインストール手順は以下の通り。
(1) 既存のRtoolsをアンインストール
(2) Building R for Windows からRtoolsをダウンロード
(3) ダウンロードした RtoolsXX.exe(XX:バージョン)をダブルクリック
(4) R console から次のコマンドを入力して、gcc がインストールされていることを確認する。

以下のようなメッセージが表示されれば成功。

これで、Rtools のインストールが完了したので、先程のコマンドを実行する。

コンパイルが走るので、時間が掛るが辛抱強く終わるのを待つ。
終ったら、バージョンを確認する。

メデタシ、メデタシ?

Rで地図を描画する – mapview

Ubuntu 17.10 へインストール

Windows環境では、問題なくインストールできたが、
Ubuntuでは、延々処理した揚句、インストール失敗。
そこで、その手順を示す。
(1) libcairo2-dev のインストール
次にインストールする svglite に必要なため、最初にこれをインストールする。

(2) svglite のインストール
Rコンソールから

(3)mapview のインストール
Rコンソールから

以上

Rで地図を描画する geom_sf()

Rでshapefileを入力して、地図を描画できると言うことで、いろいろ試してみるも、
問題山積して、収拾ががつかない状況にある。
しかし、何とか解決したものだけでもメモにして残しておく。
環境は、windows7、R 3.4.4(2018/4/6時点の最新版)

geom_sf()がインストールできない

shapefileを入力するのに、従来は maptools の readShapePoly 等を使用するわけだが、現在は

と、警告が発せられる。

Googleで調べてみると、将来の方向性として sf パッケージが良さそうなので sf をインストールしてみる。
RでGISをやるときにはsfパッケージ、という世の中になるらしい。に詳しい説明があります。)
これによって、shapefileは首尾よく入力できるようにはなった。が、sf::st_read()で入力したデータは fortify でのフォーマット変換ができないので、geom_sf()を使用することになる。

これで plot を使用すれば地図の描画はできるが、ggplot2 を使用する場合は、geom_sf()を使用しなければならない。
geom_sf()は、ggplot2 の関数だが、バージョン2.2.1にはこれがバンドルされていないと言う問題がある。
インターネットを探せば、上位にこのインストールの件についての質問が為されているが、答えは何時も

で、インストールせよとのご託宣。種々調べたが、これ以外には方法がない模様。

しかし、試しに windows 環境で実行するも、結果的に失敗に終わる。断定はできないが多分無理。
Windows な人の結論、
次期バージョンを待とう!

(インストールはこちらをご覧ください。)
windowsは見捨てて、guest os の Ubuntu 17.10 で再挑戦。インストールのコマンドは全く同じ。
こちらは、問題なくインストール完了!
ggplot2 2.2.1.9000(変なバージョン番号だが問題はなし)

(「RでGISをやるときにはsfパッケージ、という世の中になるらしい。」によれば、Ubuntu 16.10 以降でなければ、いろんな問題があるらしいので注意してください。)

reshape2とtidyr

例えば、ggplot を使用して次の様な「男女別の人口推移」のグラフを作るものとします。

総務省の人口統計等からデータは入手できます。
ダウンロード後、Excelなどで次のように編集して、csv形式でとして保存するのが一般的な方法かと思います。

単純な表なので簡単に作れますが、面倒と思う人のため、次にデータを用意しておきました。

データの構成は、このように作るのが一般的と思いますが、これを上のような棒グラフでプロットするのは大変困難です。
x軸(年次)が共通で、y軸が各々男と女を別個にプロットすると重なり合ってしまうためです。回避手段(例えば、dodge を使うなど)は有るかもしれませんが、私の力量では無理です。
この問題の解決策は、データを次の通りに変更すること(が、一番手っ取り早い手段)です。

つまり、年次別に男と女の2行にしてにデータを持つことです。当然、数値が男女何れかを識別するために、変数名「男」、「女」をデータとする必要があります。(なお、この形式のデータフォーマットは、前者を wide-format、男女別に人口を持つ後者を long-format と言うのだそうです。)
力技でこのような変換もできますが、簡単に行うのがreshape2::melttidyr::gatherです。
変換方法は次の通り。
(1) reshape2::melt

(2) tidyr::gather

この2つは、全く同じことを行っていますが、tidyrの方がスピードが速いのでお勧めだそうです。