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

まとめ

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

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

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

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

Lesson5 へ