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 なテキスト行を追加します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
ui <- fluidPage( titlePanel("censusVis"), sidebarLayout( sidebarPanel( helpText("Create demographic maps with information from the 2010 US Census."), selectInput("var", label = "Choose a variable to display", choices = c("Percent White", "Percent Black", "Percent Hispanic", "Percent Asian"), selected = "Percent White"), sliderInput("range", label = "Range of interest:", min = 0, max = 100, value = c(0, 100)) ), mainPanel( textOutput("selected_var") ) ) ) |
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”) に一致します。
|
1 2 3 4 5 6 7 |
server <- function(input, output) { output$selected_var <- renderText({ "You have selected this" }) } |
サーバ関数では、コードの最後行に出力の 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 なテキスト行を作成します。
|
1 2 3 4 5 6 7 |
server <- function(input, output) { output$selected_var <- renderText({ paste("You have selected", input$var) }) } |
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 オブジェクトとサーバ関数の両方を忘れないで更新してください。
モデル解答
まとめ
このレッスンでは、最初の reactive な Shiny アプリケーションを作成しました。その過程で、次のことを学びました
-
- Shiny アプリに reactive のオブジェクトを配置するため、ui 内で *Output 関数を使用し、
- Shiny にオブジェクトの構築方法を伝えるため、サーバで render* 関数を使用し、
- 各 render* 関数内で R の式を波括弧 {} で囲み、
- render* 式を output リストに保存し、アプリ内の reactive オブジェクトごとに1つのエントリを追加し、
- render* 式に input 値を指定することによって reactivite 性を作成します。
これらのルールに従えば、Shiny は自動的にオブジェクトを reactive にします。
Lesson 5 では、R スクリプトと外部データに依存するより洗練された reactive なアプリケーションを作成します。
Lesson5 へ



















