Graphvizのテスト

Graphvizがwordpressでも使えるらしいのでテストしてみます。プラグインには「TFO Graphviz」を使用します。

おお、素晴らしい!

TFO Graphviz 使用方法

ショートコードの一般形式は次の通り。

のリストは下表の通り。

options 説明
height=”<image_height>” イメージタグに height 属性を設定する。SVG に有効
href=”self|<URL>” 画像をクリックした時に表示する URL を指定する。デフォルト:href=””、self:同じウィンドウ、<URL:指定のURL
id=”<id>” 生成された画像をイメージマップにリンクするために使用する識別子を指定する。これを指定しない場合は、”tfo_graphviz_N”(N:1からの連番)が自動生成される。
imap=”yes|no”
imap=”yes|no”
lang=”<dot|neato|twopi|circo|fdp>” 使用する Graphviz インタープリタを指定する。デフォルトは dot
output=”<png|gif|jpg|svg>” 生成する画像フォーマットを指定する。デフォルトは png
simple=”yes|no” コードの周りに非常に基本的な DOT ラッパーが適用される。

このコードは、次のコードが生成される。

title=”<title>” 画像のタイトル。画像を参照するための alt および title 属性で使用する
width=”<image_width>” イメージタグに width 属性を設定する。

Ubuntu 18.04 にTeXlive2018をインストール

LaTeX のインストールについては、apt-get による様々な方法が説明されています。しかし、何れの方法をとっても、RStudio において R Markdown を PDF に変換できないのです。何かが足りないようではあるのですが、その何かが分からない。エラーログが、もう少しユーザフレンドリーであったらな~

そこで、最も確実なインストール方法として TeX Live ホームページの手順に従うことにしたものです。

手順

  1. インストーラのダウンロード
  2. インストーラによる TeXlive のインストール
  3. シンボリックリンクの作成

1.インストーラのダウンロード

TeX Live ホームページに行き、”download” をクリックする。

遷移したページの中から、「install-tl-unx.tar.gz (3mb)」をクリックしてダウンロードする。

ダウンロードしたファイルを解凍します。

2.インストーラによる TeXlive のインストール

TeXlive のインストールは、次のコマンドを実行するだけです。

これを実行すると、ズラズラとメッセージが表示され、最後に次のメッセージが表示され、待ち状態になります。

ここで、「i」を入力して、Enter キーを押下するとインストールが始まります。
時間はかかりますが、操作が単純で余分なことをせずにフルインストールができるのが、素晴らしい点です。

3.シンボリックリンクの作成

インストールが完了したら、”/usr/local/bin”以下にシンボリックリンクを作成します。

(注):「2018」の部分は、TeXLive のリリースバージョン(年)毎に異なります。
これにてTeXliveのインストールは完了です。

動作確認

(1) TeX 文書

次の文書を、”sample.tex” として保存します。

端末から、次のコマンドを入力し、PDF 文書が作成されるかを確認します。

(2) R Markdown

RStudio から次の R Markdown を入力し、knit します。

「mainfont」は、自分の環境に合わせ変更してください。日本語フォントを指定しないと、日本語部分が削除され「2018712」と表示されます。

latex_engine について

latex_engine: lualatex としても latex_engine: xelatex としても、問題なく動作しました。
しかし、これを指定しないとエラーで動作が停止しますので、必ず指定してください。

(参考サイト)

  1. TeX Live 2018 のインストール
  2. Ubuntu 14.04 LTSにTeXlive2015をインストール

-以上-

RStudioで日本語PDF

1.環境

項目 内容
OS windows7
R 3.5.0
knitr 1.20
RStudio 1.1.453
TeXディストリ w32Tex 角藤版

2.R Markdown

RStudioで、新規R Markdownを選択した時に作成される雛形文書そのもの。

3.結果

このまま実行した時の結果。
! Package inputenc Error: Unicode char 蟷エ (U+5E74)

(inputenc) not set up for use with LaTeX.

エラー: Failed to compile 雛形Rmd.tex. See 雛形Rmd.log for more info.
実行が停止されました

どうやら、日本語(Unicode)処理ができないらしい。

4.原因

PDF文書を指定すると、デフォルトのTexとして
(1) windows : MikTex
(2) OSX : MacTex
(3) Linux : TeX Live
のエンジンが使用されるため。
TeX Wikiによれば、
MiKTeX は Microsoft Windwos 向けの TeX のディストリビューションです. TeX Live と並んで国際的に広く使われていますが,日本語 pTeX が含まれていません. 特別な理由がない限り TeX Live または W32TeX の利用をおすすめします.
とのこと。

5.対策

YAMLヘッダーに明示的に、latex_engine として、UTF-8 ベースの TeX を指定する必要があるようです。

文書全体を以下に示します。

6.最後に

Rmdファイルに日本語名を使用したら、見事にコケました
windows上では、日本語のファイル名は使用できないようですので注意してください。
(追)
Linux(Ubuntu18.04)では、日本語ファイル名が問題なく使用できました。

追伸

再テストの結果、上記のR Markdown が一切動作しなくなりました。
Windows 上も Virtual Box の Ubuntu 上でも!
思い当たる点は、
(1) windows – 角藤版を最新にしようとインストーラを起動したこと。結果的には、何もせずキャンセルしたのだが・・・・
(2) Ubuntu – Tex Live のtlmgr が動かないので、その周りの更新等を行ったこと。

一旦、w32Tex(Windows)とTexLive(Ubuntu)を削除し、w32Texは再インストールした。
(Tex Live の再インストールは保留中)
それでも、結果は変わらず。
エラーログからは、エラー内容が全く読み取れず、対策の打ちようがない。
思い悩んだ挙句、思いついたのが「latex_engine」の変更。
「TeXworks」のタイプセットに表示されるものを指定してみよう!
① pdfplatex
指定不可。指定できるのは、pdflatex,lualatex,xelatex の何れかとのこと。
② pdflatex
しからばと、これを指定するも、想定通り Unicode 周りでエラー。
③ lualatex
万歳!問題なくPDFが出力される。
④ xelatex
念のために試してみたが、やはりエラーとなる。

結果として、私の現在の環境では「lualatex」を指定すれば良いようです。
注意
YAMLヘッダに「mainfont」を指定しないと、日本語が表示されないので、次の様に指定する必要があります。

なお、「Meiryo」の部分を「メイリオ」と指定することができませんでしたので、ご注意の程を!

R 起動コマンドの改善(windows編)

RGui を閉じる際に、毎回ワークスペースの保存有無を聞かれるが、答えはいつも[n」なのに・・・
「q(‘n’)」とするのも面倒だし。
こちらのPDF文書およびSlide Shareに、その解決策が記載されていました。
保存有無を問わないようにするには、次の何れかを指定します。

–save ワークスペースを保存して終了
–no-save ワークスペースを保存しないで終了

これを、R のインストール時に作成されたショートカットに設定します。
保存しない場合の設定は、次の通りです。
(1) ショートカットを右クリック、プロパティを開く。
(2) プロパティの「リンク先」を次の通り変更する。
(変更前)”C:\Program Files\R\R-3.5.0\bin\x64\Rgui.exe” –cd-to-userdocs
(変更後)”C:\Program Files\R\R-3.5.0\bin\x64\Rgui.exe” –cd-to-userdocs –no-save
(Rgui の場所は、自分の環境に合わせて変更してください。)
(3) 「OK」をクリックして、変更を保存する。

ubuntu 18.04 への R 3.5 のインストール

UBUNTU PACKAGES FOR Rからの引用。
手順は以下の通り。

/etc/opt/sources.listの編集

最新のR 3.5パッケージを入手するため、/etc/apt/sources.list の最下行に次のエントリを追加する。

追加は、vim でも gedit でも好きなエディタでよい。例えば、gedit なら

とし、上記コードを最下行にコピペし「保存」すればよい。
その際、何やらかんやらメッセージが出るが、ファイルは更新されているので無視してよい。

鍵の設定

(2018/11/15追加)
Ubuntu 鍵サーバにある2番目の鍵に問題があるので、次の何れかの方法でキーを登録する必要がある。

詳しくは、こちらを参照。

R のインストール

(以下、2019/05/24 追記)

RStudio インストール

ダウンロードサイトより、インストールするプラットホームに該当するインストーラ(例:RStudio 1.2.1335 – Ubuntu 18 (64-bit))をダウンロードし、ダウンロード後それをダブルクリックするのみ。

tidyverse インストール

RStudio から “tidyverse” をインストールしようとすると

error dependencies ‘httr’ ‘rvest’ ‘xml2’ are not available for package ‘tidyverse’

とのエラーが発生する。
これを回避するため、次のコマンドを実行しておく必要がある。

SpyderのUpdate

Anacondaのインストールと同時にインストールされた Spyder の Update 方法です。
pipを使用せず、condaを使用するよう促されますので、次の通りコマンドラインから入力します。

デスクトップ・ショートカットの作成

年を取ってくると、折角インストールしたものの名前をすぐ忘れてしまう。
困ったものだ。
Windowsなら、デスクトップにショーカットアイコンをずらずら並べれておけば、名前を忘れる心配もないのだが、Ubuntu はそうもいかない。
物よっては、デスクトップ左下隅のアイコンをクリックすればアプリケーションがアイコンで表示されるものもあるが、anaconda 関連のアプリはそれもダメで(何故なんだろう)、ターミナルからコマンドを叩かなければ実行できない!!!。

その様な訳で、どうしてもデスクトップ・ショートカットが必要なのです。
色々調べた結果、一番簡単な Ububtu 18.04 におけるデスクトップ・ショートカットの作成方法を、あくまで備忘録として以下に書き留めておきます。
詳しくは、こちらを見て下さい。

ここでは、マニュアルで作成するよりも簡単に作成できる、gnome-desktop-item-editを使用します。

1. gnome-desktop-item-edit のインストール

先ずは、gnome-desktop-item-edit をインストールします。

2. ランチャーの作成

デスクトップ・ショートカット・ランチャーを作成するため、次の linux コマンドを実行し、図に示すような必要事項を入力します。
(図では、”anaconda-navigator” を例として使用しています。)

最後に、OKを押すと、”anaconda-navigator.desktop” というファイルが “~/デスクトップ/” に作成されます。

動作確認

この段階で、デスクトップのショートカットが出来ているはずですので、それをダブルクリックします。
1回目の実行時には警告が出ますが、無視して実行すれば、次回以降このメッセージは表示されなくなります。
(2018/11/15 追記)
デスクトップ直後は、アイコンに「anaconda.png」を指定しても異なったアイコンが表示されました。
修正ができないので、そのまま実行を強行したところ(警告が出ます)、指定のアイコンに変りました。
何故????

Lesson7 – アプリの共有

今や、便利な Shiny アプリを作れるようになりましたが、他の人と共有できますか?このレッスンでは、Shiny アプリを共有するいくつかの方法を紹介します。

Shiny アプリの共有については、2つの基本的な選択肢があります:

  1. Shiny アプリを R スクリプトとして共有する。これはアプリを共有する最も簡単な方法ですが、ユーザが自分のコンピュータに R をインストールしている(およびその使い方を知っている)必要があります。これまで、このチュートリアルでアプリを起動してきたように、ユーザもこれらのスクリプトを使用して自分の R セッションからアプリを起動することができます。
  2. Shiny アプリを Web ページとして共有する。これは間違いなく、Shinyアプリを共有する最もユーザフレンドリーな方法です。ユーザは、Web ブラウザを使用してインターネット経由でアプリにナビゲートできます。アプリは、完全にレンダリングされ、最新の状態になっており、直ぐに使えることが確認できるでしょう。

R スクリプトとして共有

R を使用すれば、誰でも Shiny アプリを実行できます。それには、app.R ファイルのコピーの他に、アプリで使用している補足資料(www フォルダや helpers.R ファイルなど)が必要です。

ファイルを他のユーザに送信するには、ファイル(zip ファイルなど)を電子メールで送信するか、オンラインにホストします。

ユーザは、ファイルを作業ディレクトリの app ディレクトリに置き、あなたが使用したものと同じ R コマンドでアプリを起動できます。

Shiny には、オンラインにホストされているファイルを簡単に使用できる3つのコマンド – runUrl、runGitHub、runGist – が組み込まれています。

runUrl

runUrl は、Weblink から直接 Shiny アプリケーションをダウンロードして起動します。

runURLを使用するには:

  • Shiny アプリケーションのディレクトリを zip ファイルとして保存する
  • Web ページのリンクに zip ファイルをホストする。リンクにアクセスできる人は、次のコマンドを実行すれば R の中から誰でもアプリを起動できます:

runGitHub

ファイルをホストする Web ページがない場合は、www.github.com に無料でホストすることができます。

GitHub は、単にファイルをホストするだけでなく、R 開発者にとって人気のあるプロジェクトホスティングサイトです。GitHub は、課題トラッカー、wiki、git バージョン管理システムとの緊密な統合など、コラボレーションをサポートするための多くの機能を提供します。 GitHub を使用するには、サインアップ(無料)してユーザ名を選択する必要があります。

GitHub でアプリを共有するには、GitHub にプロジェクトリポジトリを作成します。 次に、app.R ファイルとアプリが使用する補足ファイルを一緒にしてリポジトリへ保存します。

あなたのユーザは、下を実行することでアプリを起動できます:

runGist

匿名でファイルをオンラインに投稿したい場合、GitHub は gist.github.com でファイルを共有するための pasteboard サービスを提供しています。 このサービスを利用する場合、GitHub アカウントにサインアップする必要はありません。 GitHub アカウントを持っていても、簡単に素早く Shiny プロジェクトを共有することができます。

アプリを gist として共有するには:

  • app.Rファイルをコピーして gist Web ページに貼り付けます。
  • GitHub が指定する gist の URLを書き留めておきます。

gist を作成したら、ユーザは runGist(“<gist number>”) でアプリを起動できます。ここで、”<gist number>” は Gist の Web アドレスの最後に表示される番号です。

下は、gist としてホストされているアプリの例です。次により、このアプリを起動することができます:

web ページとして共有

上の方法すべてには、共通した制限があります。それは、自分のコンピュータに R と Shiny をインストールする必要がある点です。

しかし、Shiny は、R を持っていない(そしてそれを取得する意思のない)人々と出力を共有する完璧な機会を作り出します。 あなたの Shiny アプリは、世界で最も広く使われているコミュニケーションツールの 1 つである web ページであるのです。URL にアプリをホストすれば、ユーザはアプリを訪問することができます(生成するコードについて心配する必要はありません)。

Web ホスティングに精通している場合は、自分で Shiny アプリをホストすることができます。

より簡単な体験やサポートが必要な場合は、RStudio が Shiny アプリケーションを Web ページとしてホストする 4 つの方法を提供しています。

  1. shinyapps.io
  2. Shiny Server
  3. Shiny Server Pro
  4. RStudio Connect

Shinyapps.io

Shiny アプリケーションを Web ページに変換する最も簡単な方法は、Shinyapps のための RStudio のホスティングサービスである shinyapps.io を使用することです。

shinyapps.io を使用すると、R セッションから RStudio がホストするサーバに、直接アプリケーションをアップロードすることができます。サーバ管理ツールを含め、アプリを完全に制御できます。詳細については、shinyapps.io を参照してください。

Shiny Server

Shiny Server は、Shiny アプリをホストするために設計された Webサーバを構築する、Shiny のコンパニオンプログラムです。これは、無料のオープンソースで、GitHub から入手できます。

Shiny Server はサーバ・プログラムで、Linux サーバが Shiny アプリを Web ページとしてホストするために実行できます。Shiny Server を使用するには、Ubuntu 12.04 以降(64ビット)と CentOS/RHEL 5 (64 bit) を明示的にサポートする Linux サーバが必要です。明示的にサポートしているディストリビューションを使用していない場合でも、Shiny Server をソースからビルドすれば使用することができます。

同じ Shiny Server を使用して複数の Web ページに複数の Shiny アプリケーションをホストすることができ、ファイアウォールの後からアプリケーションを配置することができます。

Shiny Server のインストールと設定の詳細な手順については、Shiny Server ガイドを参照してください。

Shiny Server Pro

Shiny Server は、アプリを Web に取り込み、Shiny の公開ニーズをすべて引き受けます。しかし、営利目的で Shiny を使用する場合は、以下のような、ほとんどの有料サーバ・プログラムに付属するサーバ・ツールを使用することをお勧めします。

  • パスワードの認証
  • SSL サポート
  • 管理ツール
  • 優先サポート
  • 等々

必要な場合は、RStudio の有償プロフェッショナルバージョンの Shiny Server をチェックしてください。

RStudio Connect

RStudio Connect は、R を使用してチームで作成した作品のための新しいパブリッシングプラットフォームです。Shiny アプリケーション、R Markdown レポート、ダッシュボード、プロットなどを 1 つの便利な場所で共有できます。RStudio Connect を使用すると、ボタンを押すだけで RStudio IDE から発行でき、レポートや柔軟なセキュリティポリシーの実行をスケジュールできます。

RStudio Connect と提供される機能の詳細については、ここを見てください。

まとめ

Shiny アプリは簡単に共有できます。R スクリプトのカップルとして、または自身の URL を持つ完全に機能する Web アプリとして、アプリを共有することができます。各方法にはそれぞれの利点があります。

次のことを学習しました:

  • R のコピー、Shiny、アプリのファイルのコピーがあれば誰でもアプリを起動できます。
  • runUrl、runGitHub、runGist を使用すると、Web リンクから Shiny ファイルを簡単に共有および取得ができます。
  • shinyapps.io を使用すれば、アプリをそれ自身 URL にライブ web アプリにすることができます。
  • オープンソースの Shiny Server を使用して、Shiny アプリをホストする Linux サーバを構築することができます。
  • より詳細な制御が必要な場合や、大量のトラフィックを管理したい場合は、RStudio から Shiny Server Pro または RStudio Connect を購入することができます。

おめでとう。あなたは Shiny 開発プロセス全体を通して作業を完了しました。洗練された reactive なアプリケーションを構築し、配置し、他の人と共有することができます。ユーザはあなたのデータに接触し、新しい方法であなたのストーリーをフォローすることができます。

次は、Shiny の高度な機能を練習してみましょう。

Lesson6 – reactive 式を使用する

Shiny アプリは、実行速度が速く、素早く作れるのでユーザを驚かせます。しかし、アプリが多数重い計算をする必要がある場合はどうでしょうか?

このレッスンでは、reactive 式を使用した Shiny アプリの効率化方法について説明します。reactive 式を使用すると、アプリのどの部分で更新するかを制御できるため、処理速度を低下させる不要な計算を防ぐことができます。

始める前に:

  • 作業ディレクトリに stockVis という名前の新しいフォルダを作成してください。
  • 次のファイルをダウンロードして、それらを stockVis に配置してください:app.Rhelpers.R
  • runApp(“stockVis”) でアプリを起動します。

StockVis は、R の quantmod パッケージを使用しているので、まだインストールしていない場合は、install.packages(“quantmod”)quantmod をインストールする必要があります。

(訳注)2018年3月、Googleが株価情報の提供を中止したため、app.Rにエラーが発生します。これを回避するには、app.R の 48行目を次の通り変更します。以下、「Google」と言う名称が出てきた場合は、全て「Yahoo」と読み替える必要があるでしょう(断定はできませんが)。

新アプリ:stockVis

stockVis アプリは、(株式)銘柄コードで株価を検索し、その結果を折れ線グラフとして表示します。 このアプリでは、

  1. 調べる株を選択する
  2. 評価する日付の範囲を選ぶ
  3. y 軸には、株価をプロットするのか、株価を対数でプロットするのかを選択し、
  4. インフレに対して価格を訂正するかどうかを決める。


“Adjust prices for inflation” チェックボックスはまだ機能しないので注意してください。このレッスンのタスクの 1 つは、このチェックボックスを修正することです。

デフォルトで、stockVis は SPY 銘柄( S&P 500 全体のインデクス)を表示します。別の株を探すには、Google ファイナンスが認識する株式の記号を入力します。ここで Yahoo の株式記号を調べることができます。一般的な記号の中には、GOOG(Google)、AAPL(Apple)、GS(Goldman Sachs)などがあります。

stockVis は、次の quantmod パッケージの 2 つの関数に大きく依存しています:

  1. getSymbols を使用し、Google ファイナンスやセントルイス連邦準備銀行などの Web サイトから、財務データを R に直接ダウンロードします。
  2. ChartSeries を使用し、価格を魅力あるチャートに表示します。

stockVis は、helpers.R という R スクリプトにも依存しています。これには、インフレに対する株価を調整する関数が含まれています。

チェックボックスと日付範囲

stockVis アプリは、いくつかの新しいウィジェットを使用しています。

  • dateRangeInput で作成した日付範囲セレクタ
  • checkboxInput で作成したいくつかのチェックボックス。チェックウィジェットは非常に簡単です。チェックボックスをチェックした場合は TRUE を、チェックを外した場合は FALSE を返します。

ui オブジェクト内で、このチェックボックスにはそれぞれ log と adjust という名前を付けていますので、server 関数内では input$log と input$adjust として参照します。ウィジェットとその値の使い方を再確認したい場合は、Lesson 3 と Lesson 4 をご覧ください。

計算の効率化

stockVis アプリには問題があります。

“Plot y axis on the log scale” をクリックすると、input$log の値が変わるため、renderPlot の式全体が再実行されます:

renderPlot を再実行するたびに

  1. getSymbols を使用してGoogle ファイナンスからデータを再取得し、
  2. 軸を修正してでチャートを描画し直します。

プロットを再描画するのにデータを再フェッチする必要がないので、これは好ましくありません。 実際、データをあまりにも頻繁に再フェッチすると、Google ファイナンスは接続を切り離してしまいます(ボットのように見えてしまうためです)。しかし、もっと重要なことは、getSymbols の再実行は不要で、アプリの処理速度を低下させると共に、サーバの帯域幅が消費される可能性があると言うことです。

reactive 式

reactive 式で、リアクション中に再実行するものを制限することができます。

reactive 式は、ウィジェット入力を使用して値を返す R 式です。reactive 式は、オリジナルのウィジェットが変更されるたびに値を更新します。

reactive 式を作成するには、R 関数を波括弧で囲んだ reactive 関数を使用します(render* 関数と同じです)。

例えば、下には Google からのデータを取得するために stockVis のウィジェットを使用する reactive 式があります。

式を実行すると、getSymbols が実行され、結果として価格データのデータフレームが返されます。dataInput() を呼び出すことによって、renderPlot で価格データにアクセスするための式を使用することができます。

reactive 式は、通常の R 関数より少しスマートで、値をキャッシュし、その値が何時対象外になったかを認識します。これは何を意味するのでしょうか?最初に reactive 式を実行すると、式はその結果をコンピュータのメモリに保存します。次回 reactive 式を呼び出すと、計算を実行せずにこの保存した結果を返します(これにより、アプリの処理速度が向上します)。

reactive 式は、結果が最新である場合にのみ、保存した結果を返します。reactive 式は、ウィジェットが変更され結果が古くなった場合には、結果を再計算して新しい結果を返し、そのコピーを保存します。reactive 式は、新しいコピーが古くなるまで使用します。

この動作をまとめましょう:

  • reactive 式は、初めて実行されたときにその結果を保存する。
  • その後、reactive 式が呼び出された場合は、保存されている値が古くなったかどうか(すなわち、依存するウィジェットが変更されたかどうか)をチェックする。
  • 値が古い場合、reactive オブジェクトはそれを再計算する(そして新しい結果を保存する)。
  • 値が最新の場合、reactive 式は計算を行わずに保存された値を返す。

この動作を使用して、Shiny がコードを不必要に再実行しないようにすることができます。下の新しい StockVis アプリでreactive 式がどのように動作するかを考えてみましょう。

“Plot y axis on the log scale” をクリックすると、input$log が変更され、renderPlot が再実行されます。今

    1. renderPlot は、dataInput()を呼び出す
    2. dataInput は、日付ウィジェットと symb ウィジェットが変更されていないことをチェックする
    3. dataInput は、Google からデータを再取得せずに保存された株価データを返す
    4. renderPlotは、グラフを正しい軸で再描画する

 

依存関係

ユーザが symb ウィジェット内の銘柄コードを変更した場合はどうなりますか?

変更した場合、renderPlot で描いたプロットが古くなっていますが、renderPlot はもう input$symb を呼び出さなくなっています。Shinyは、input$symb のプロットが古くなったことを知っているのでしょうか?

はい、Shiny はそのことを知り、プロットを再描画します。 Shiny は、出力オブジェクトが依存している reactive 式やウィジェットの入力を追跡します。次の場合、 Shiny は自動的にオブジェクトを再構築します

      • オブジェクトの render* 関数の入力値が変更されるか、または
      • オブジェクトの render* 関数の reactive 式が古くなった場合

reactive 式は、入力値を出力オブジェクトに接続するチェーン内のリンクと考えることができます。出力内のオブジェクトは、チェーンの下流のどこで行った変更にも応答します。(reactive 式は他の reactive 式を呼び出すことができるので、長いチェーンを作ることができます)

reactive 式または render* 関数内から reactive 式を呼び出すだけです。どうして?これらの R 関数のみが reactive 出力を処理するために用意されており、警告なしで変更することができます。実際、Shiny はこれらの関数の外で reactive な式を呼び出さないようにします。

準備作業

“Adjust prices for inflation” という動作しないチェックボックスを修正していきます。ユーザは、インフレーションに対して調整した価格と、調整していない価格に切り換えることができます。

helpers.R の調整関数では、セントルイス連邦準備銀行が提供する消費者物価指数データを使用して、過去の価格を現在の価格に変換します。しかし、どのようにして、アプリにこれを実装できるでしょうか?

下に 1 つの解決方法がありますが、理想的なものではありません。理由がわかりますか?再び、input$log と関係してきます。

Reveal answer
adjust は renderPlot の内部で呼び出されています。adjust ボックスがチェックさた場合、y のスケールを通常のものと対数変換したもの(または、その逆)に切換えるたびに、すべての価格が再調整されます。この再調整は不要な計算です。

やってみよう

この問題を解決するには、新しい reactive 式をアプリに追加します。reactive 式は、dataInput の値を調整した(または調整していない)データのコピーを返す必要があります。

解答を思いついたら、下のモデル解答と比較してください。 ユーザが “Plot y axis on the log scale” をクリックしたときに、アプリ内でどの計算が行われ、どの計算が行われないのかを理解してください。

Reveal answer
各入力を、reactive 式または render* 関数に分離しました。入力が変更されると、古くなった式だけが再実行されます。

フローの例を次に示します。

      • ユーザが “Plot y axis on the log scale.” をクリックする。
      • renderPlot を再実行する。
      • renderPlot は finalInput を呼び出す。
      • finalInput は dataInput と input$adjust でチェックする。
      • 何も変更されていない場合、finalInput は保存された値を返す。
      • 何れかが変更された場合、finalInput は現在の入力値で新しい値を計算する。新しい値は renderPlot に渡され、将来のクエリに新しい値を格納する。

まとめ

reactive 式でコードをモジュール化することにより、アプリをより速くすることができます。

      • reactive 式は、入力値または他の reactive 式からの値を取得し、新しい値を返します
      • reactive 式は、結果を保存し、入力が変更された場合にのみ再計算します
      • reactive 式は、reactive({ }) で作成します
      • reactive 式は、式の名前の後に括弧 () を付けてを呼び出します
      • reactive 式は、他の reactive 式か render* 関数内からのみ呼び出します

今やあなたは、洗練された効率的な Shiny アプリケーションを作成することができます。このチュートリアルの最後のレッスンでは、あなたのアプリケーションを他の人との共有方法を説明します。

Lesson7 へ

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 へ