Lesson5 – Rスクリプトとデータの使用

このレッスンでは、Shiny アプリケーションで使用するデータ、R スクリプト、パッケージのロード方法を説明します。ここでは、米国国勢調査データをビジュアル化する洗練したアプリを構築していきます。

counties.rds

counties.rds は、UScensus2010 R パッケージで収集された米国の各郡の人口統計データのデータセットで、ここからダウンロードできます。

ファイルを取得したら、

  • census-app ディレクトリに data という名前の新しいフォルダを作成します。
  • counties.rds をデータフォルダに移動します。

作業が完了したら、国勢調査の app フォルダは次のようになります。

counties.rds のデータセットには次のものが含まれています

  • 米国の各郡の名前
  • 郡の総人口
  • 郡内の白人、黒人、ヒスパニック系、アジア系の住民の割合

helpers.R

helpers.R は、上に図ようなコロプレス・マップを作成を補助する R スクリプトです。コロプレス・マップとは、変数の地域的な違いを色分け表示する地図です。ここでは、helpers. R に、counties.rds のデータをマップするように設計した、関数 percent_map を作成します。helpers.R は、ここからダウンロードできます。

helpers.R は R の maps と mapproj パッケージを使用します。これらのパッケージをインストールしたことがなければ、アプリの作成前にインストールする必要がありますので、次を実行してください

Census-appディレクトリ内に helpers.R を保存してください(下記参照)。

helpers.R の percent_map 関数は、次の 5 つの引数を取ります:

引数 入力
var counties.rds データセットの列ベクトル
color colors() の出力に表示される文字列
legend.title プロットの凡例のタイトルとして使用する文字列
max シェードの範囲を制御するパラメータ(デフォルトは100)
min シェードの範囲を制御するパラメータ(デフォルトは0)

コマンドラインで counties をコロプレス・マップとしてプロットするために、percent_map を次のように使用することができます。

注:上のコードは、census-app が作業ディレクトリ内のサブディレクトリであることを前提としています。census-app の親ディレクトリとして作業ディレクトリが設定されていることを確認してください。作業ディレクトリの場所を変更するには、RStudio のメニューバーで、 Session > Set Working Directory > Choose Directory… をクリックします。

percent_map は、counties データをコロプレス・マップとしてプロットします。ここでは、郡内の白人住民の割合を色の濃い緑色でプロットしています。

ファイルとファイルパスのロード

上のコードを見てください。 percent_map を使用するには、最初に source 関数で helpers.R を実行し、次に、readRDS 関数で counties.rds をでロードしています。library(maps) と library(mapproj) も前もって実行しています。

アプリで percent_map を使用する場合、Shiny から同じ関数を呼び出す必要がありますが、この関数の書き方が変わります。source と readRDS の両方にはファイルパスが必要となるが、Shiny アプリにおいて、ファイルパスはコマンドラインと同じように動作しません。

Shiny は、server.R のコマンドを実行する場合、すべてのファイルパスを app.R と同じディレクトリから開始するものとして取扱います。つまり、app.R を保存したディレクトリが、Shiny アプリの作業ディレクトリになります。

今回は、app.R と同じディレクトリに helpers.R を保存しているので、Shiny にロードには次のようにします:

app.R が入っているディレクトリのサブディレクトリ(data)に counties.rds を保存したので、下の通りそれをロードすることができます。

maps と mapproj パッケージは、通常の方法でロードすることができます

ファイルパスは必要ありません。

実行

これらのコマンドを app.R スクリプトに配置すると、Shiny はそのコマンド全てを実行します。しかし、Shiny は app.R スクリプトのいくつかのセクションを他よりも多く実行するため、それらを配置する場所によって実行(または再実行)される回数が決まります。

runApp を初めて呼び出したときに、Shiny はスクリプト全体を実行します。Shiny は、この時にサーバ関数を実行します。

Shiny は、新しいユーザが到着するまでサーバ関数の実行をセーブし、新しいユーザがアプリを訪問する都度、サーバ関数を再実行します。この関数は、Shiny が各ユーザ毎の reactive オブジェクトのセットを構築するのを手助けします。

ユーザがウィジェットとの対話を通して値を変更した時、Shiny は、値が変更されたウィジェットに依存する各 reactive オブジェクトに割り当てられた R 式を再実行します。 ユーザが非常にアクティブな場合、これらの式は何回も再実行される可能性があります。

これまでに学んだことは次のとおりです。

  • shinyApp 関数は、アプリケーションを起動すると一度実行されます
  • server 関数は、ユーザがあなたのアプリを訪れるたびに 1 回実行されます
  • render* 関数内の R 式は何度も実行されます。Shinyは、ウィジェットの値が変更されるたび、それを一度実行します。

この情報をどのように使用できますか?

source スクリプトはライブラリをロードし、server 関数の外の app.R の先頭でデータセットの入力を行います。 Shinyはこのコードを一度だけ実行します。これは、サーバに含まれる R 式の実行用にサーバをセットアップするのに必要なことです。

server 関数内ではあるが、render* コールの外側にユーザ指定のオブジェクトを定義します。これらは、各ユーザが自分個人用のコピーが必要になるだろうと思われるオブジェクトです。例えば、ユーザ・セッション情報を記録するオブジェクトです。このコードはユーザごとに 1 回実行されます。

render* 関数の内部でオブジェクトを構築するために Shiny が再実行する必要のあるコードのみを配置します。Shiny は、チャンクに記載されているウィジェットをユーザが変更するたびに、render* チャンク内のすべてのコードを再実行します。これはかなり頻繁に行うことができます。

一般的に、そこに存在する必要のない render 関数内に、コードを置くのは避けてください。アプリ全体が遅くなります。

やってみよう 1

次の app.R を census-app ディレクトリにコピーしてください。
app.R

次に、下のコードを app.R スクリプトに追加してください。

コマンドは、効率的な場所に配置してください。

注:これはアプリを完成させる 2 ステップのうちの最初のステップです。上のコードを挿入するのに最適な場所を選択しますが、アプリは実行しないでください。「やってみよう 2」でいくつかの引数を実際のコードに置き換えるまで、アプリはエラーを返します。

モデル解答 1

Reveal answer

アプリの終了

国勢調査の視覚化アプリケーションには、1 つの reactive オブジェクト、”map” という名前のプロットがあります。 プロットは、percent_map 関数で作成され、5 つの引数をとります。

  • 最初の 3 つの引数 var、color、legend.title は、選択ボックスウィジェットの値に依存します。
  • 最後の 2 つの引数 max と min は、スライダバー・ウィジェットの最大値と最小値です。

下の server 関数は、percent_map の reactive 引数を作成する 1 つの方法を示しています。 R の switch 関数は、選択ボックスウィジェットの出力を好きなものに変換することができます。しかし、スクリプトは不完全です。color、legend.title、max、min の値は指定できません。
注:スクリプトはそのまま実行できません。実行する前にスクリプトを完了する必要がありますが、これは「やってみよう 2」のタスクです。

やってみよう 2

国勢調査を視覚化するアプリケーション構築のためのコードを完成させます。

アプリを配置する準備ができたら、app.R ファイルを保存して runApp(“census-app”) を実行します。全てが動作すれば、アプリは下の図のようになります。

次のことを決める必要があります

  • percent_map の引数値を作成する方法
  • この引数を作成するコードをどこに置くか

ユーザが関連したウィジェットを変更するたびに、引数値を切り替えることを忘れないでください。コードが完成、または立ち往生した場合は、下のモデル解答を見てください。

モデル解答 2

Reveal answer

まとめ

R スクリプト、パッケージ、データセットをロードすることで、より複雑な Shiny アプリを作成することができます。

以下の点を心に留めておいてください:

  • app.R を配置するディレクトリは、Shiny アプリケーションの作業ディレクトリです
  • Shiny は、server 関数の前にある app.R の先頭に配置されたコードを、アプリケーションのロード時に1回だけ実行します。
  • Shiny は、server 関数の中に配置されたコードを複数回実行するので、アプリの処理速度が遅くなります。

また、switch は Shiny ウィジェットを複数選択するための便利な仲間であることも学びました。R 式内のウィジェットの値を変更するために switch を使います。

アプリが複雑になると、効率が悪くなり、速度が遅くなる可能性があります。Lesson 6 では、reactive 式の高速 modular アプリの構築方法を説明します。

Lesson6 へ