2018-11-18

Amazon Fire HD 8 タブレットを買いました

Amazon.co.jp で Fire HD 8 タブレットの New モデルが手頃な価格で販売されていたので買ってしまいました。

私は、ほぼ毎週三泊四日の国内出張をしているのですが、会社の PC 以外に自分の PC 環境を携えたくて GPD Pocket という UMPC に Linux をインストールして携行しています。画面が小さいので外付のモバイルディスプレイを購入しました。新幹線車中で本を読みたいので Amazon の Kindle も持ち歩いています。

考えてみると、ずいぶん荷物を重くしてしまっています。

Linux を使うことにこだわりがあるとは言え、ホテルでは小さい画面でプログラミングをする気にはなれず、インターネットにアクセスして SNS を見たり Amazon Prime Video を観たりと、いたって普通の使い方をしています。しかも、7 インチ画面に 1920×1080 の解像度は細かすぎるので、わざわざ解像度を半分に落として使っているのです。これは外付のモバイルディスプレイについても同様です。

Amazon.co.jp のサイトを見ると Fire HD 8 タブレットの New モデル (16GB) が 8,980 円で販売されていました。大変魅力的な価格です。Linux マシンを使いたい、というこだわりを捨てて、実用的なスペックの端末を使い潰すつもりと割りきって使うのであれば、これは大変安い買い物に思えます。

プライム会員になって、書籍をはじめ、ビデオや音楽にも Amazon にどっぷり漬かった生活をしているので、Amazon Fire タブレットを買えば、これ一台で仕事以外の用途は間に合います。おまけに持ち歩くデバイスの数が減るので、これから冬服でますます重くなる荷物の負担も軽くなります。

そう考えると購入するのは今でしょってことで、週末の金曜日の夜に注文したのでした。ストレージは 32GB のものにして、専用カバーケースと 64GB の microSD も加ました。これでも二万円を超えないとは驚きです。配達はプライムで翌土曜日午後の選択が可能でしたが、日中出かける用事があったので、念の為、日曜日の午前中に配達と指定しておきました。

はたして日曜日の朝 10 峙ごろ荷物が届き、開封して使い始めています。さすがに最初はバッテリーの残量は少ないだろうと予想していましたが 80% 程度あり、そのまま設定やアップデートの処理を進めることができました。

使いはじめの Amazon Fire HD 8

Amazon Silk ブラウザ、Amazon のコンテンツ関係のアプリ、そして Amazon 関係の宣伝広告が入りますが、その他は Android の端末そのもので、要するに Amazon 向けによくカスタマイズされた Android 端末という印象です。

いままで本を読むのに Kindle paperwhite を 3 年ぐらい使ってきて、他の端末が真似のできない電池の持ちの良さが大変気に入っていました。しかし、そろそろカラーの Fire も欲しいと思っていましたので、Amazon 専用機 + α としてしばらく使い心地を試してみます。

参考サイト

  1. 【レビュー】Amazon Fire HD 8 タブレット(2018年版:第8世代) | 有限工房 [2018-11-08]
  2. Fire HD 8 レビュー!安く買える動画や漫画を見るには最適なタブレット! - シンスペース [2018-10-29]
  3. すべてのタブレット端末を駆逐する新「Fire HD 8」実機レビュー - Engadget 日本版 [2018-10-05]

 

ブログランキング・にほんブログ村へ
にほんブログ村

2018-11-03

Fedora 29 リリース

Fedora 29 が 10 月 30 日(米国時間)にリリースされました。既にベータリリースから Fedora 29 に移行していましたので、正式版のリリースの監視がおろそかになっていました。💦Fedora (/fɪˈdɔːɹə/) は、レッドハット社が支援するコミュニティー Fedora Project によって開発されている RPM 系 Linux ディストリビューションです。最初に Fedora Core 1 がリリースされてから 11 月 6 日で 15 周年を迎えます。㊗

タイムリーにブログ記事を書くことができなかったのですが、Fedora 29 のリリースに関する記事を集めました。

Fedora 29 のリリースに関する記事

  1. 「Fedora 29」公開--IBMによるレッドハット買収が注目されるもコミュニティは通常通り - ZDNet Japan [2018-10-31]
  2. Fedora 29リリース、モジュラーリポジトリが全エディションで利用可能に | OSDN Magazine [2018-10-31]
  3. Fedora 29正式版がリリース - GNOME 3.30の導入など | ソフトアンテナブログ [2018-11-01]
  4. 「Fedora 29」 正式リリース | Think IT(シンクイット) [2018-11-01]
  5. 2018年11月1日 「Fedora 29」が正式リリース,モジュラリティを完全実装:Linux Daily Topics|gihyo.jp … 技術評論社 [2018-11-01]
  6. ARM版Fedora 29がサポートしてるRaspberry Piは [2018-11-02]

そういえば、Fedora 29 から、起動時、終了時に PC メーカーのロゴが表示されるようになりました。

 

ブログランキング・にほんブログ村へ
にほんブログ村

2018-10-21

JavaFX 11 と Netbeans 9.0

Oracle は、先月(米国時間の 2018 年 9 月 25 日)に Java SE 11 / JDK (Java Development Kit) 11 の一般提供を開始しましたが、このリリースから JavaFX のパッケージが削除されてしまいました [1]。JavaFX でちょっとした GUI プログラムを作って業務にも使っていたので、しばらくは JDK 11 に移行せずに古い JDK を使い続けるしかないかなと思っていました。

しかし、JDK 11 がリリースされる一週間前の 9 月 18 日 (UTC) に、単独で JavaFX 11 がリリースされていたのでした [2]。JavaFX に関する情報収集に精を出していなかったせいもあって、JavaFX 11 の存在に気が付い時にはリリースから一カ月近くが経過していました💦。実は Java 11 のリリースノート [1] には、この JavaFX 11 についての情報も記載されていたのですが…、リリース・モデル [3] の変更についての話題に気を取られ、全然読んでいませんでした。

しかしこれで NetBeans 9.0 で JavaFX のアプリケーションのビルドができると意気込み、悪戦苦闘したものの、なんとか、こつこつ作っている JavaFX のアプリケーションのビルドに成功したのでした。そのアプリケーションは紹介できないので、テスト用にバージョンを確認する小さな JavaFX プログラムのスクリーンショットを載せました。

Windows 7 上での JavaFX 11 アプリケーション実行例

目的と Linux の使用環境

今回の目的は、Java 8 で利用していた JavaFX のプロジェクトを、Java 11 の環境へ移行することです。ただし、Netbeans 9.0 を開発環境に使っている場合に限定します。移行するサンプルとして JavaVersion という簡単なプロジェクトを使います。この記事の終わりにコードを紹介しています。

自宅で Linux 環境でも同じように Java 11 へ移行して、JavaFX 11 を利用できるかどうか確認しました。Fedora 29 beta から OpenJDK 8 と 11 を共存させていたのですが、OpenJDK 8 の方を完全に削除しました。使用環境は以下の通りです。

  • OS: Fedora 29 beta (x86_64)
  • IDE: Apache NetBeans IDE 9.0 (Build incubator-netbeans-release-334-on-20180708)
  • java-11-openjdk-11.0.0.28-1.fc29.x86_64
  • java-11-openjdk-devel-11.0.0.28-1.fc29.x86_64
  • java-11-openjdk-headless-11.0.0.28-1.fc29.x86_64
  • java-11-openjdk-javadoc-11.0.0.28-1.fc29.x86_64
  • java-11-openjdk-src-11.0.0.28-1.fc29.x86_64

Wayland に未対応

JavaFX 11 のリリースノート [4] を読むと、Ubuntu 18.04 で Wayland のウィンドウサーバーを有効にすると JavaFX 11 がクラッシュするとあります。これは、このバージョンから JavaFX のコードが GTK 3 へ移行したことに原因があるようです。これは Ubuntu 固有の問題ではなく、Fedora でも確認できました。

これを回避する方法として次の二点が紹介されています。

  1. Wayland を使わず Xorg を使う。
  2. 強制的に GTK 2 を使う。java -Djdk.gtk.version=2 ...

将来この問題が GTK 3 の環境下で解決されることを期待して、ひとまずログイン時にデフォルトの Wayland ではなく、Xorg を明示的に指定 (GNOME on Xorg) して対応することにします。

GNOME ログイン時に Wayland を無効に(GNOME on Xorg を選択する)

※ これからの説明は、参考サイト [5] の内容を確認し、自分の環境に合わせて書き直したものです。

JavaFX 11 のダウンロードとライブラリの登録

参考サイト [6] から、JavaFX Linux SDK (openjfx-11_linux-x64_bin-sdk.zip) をダウンロードして、適当なディレクトリに展開します。私は、ホームディレクトリ内に lib ディレクトリを用意しておいて、その中に展開しています。

Netbeans を起動して、メニューバーから Tools → Libraries を選び、Ant Library Manager ダイアログの画面左下の New Library ... ボタンをクリックして、展開しておいた /home/bitwalk/lib/javafx-sdk-11/lib/ 内の jar ファイルを選択して JavaFX という名前を付けてライブラリに登録しておきます。

JavaFX ライブラリの登録

Netbeans 9.0 で JavaFX のプロジェクトは作れない

JDK 11 には JavaFX 11 の SDK が含まれていないので当然ですが、Netbeans 上で JavaFX プロジェクトを作成することはできません。

JDK 11 での JavaFX プロジェクトの作成

Netbeans 9.0 でモジュール用プロジェクト ModuleTest を作成

メニューバーから Files → New Project... を選び、New Project のダイアログ画面の Choose Project のステップにおいて Categories のリストから Java、Projects のリストから Java Modular Project を選択して Next > ボタンをクリックします。

Name and Location ステップで、プロジェクト名などの設定をします。ここでは Project Name を ModuleTest として Finish ボタンをクリックしてプロジェクトの作成を完了します。

モジュール用プロジェクト ModuleTest の作成

ここでは、今まで Java のバージョンを表示する JavaFX のプロジェクト JavaVersion を新しく作成したモジュール用プロジェクトにコピーするため、プロジェクトのペインに表示しています。JavaVersion が赤字になっているのは、この環境ではエラーがあってビルドできないからです。

JavaFX ライブラリの追加

さて、作成したプロジェクト ModuleTest を選択、右クリックしてプロダウンメニューを表示、Properties を選択してプロジェクトのプロパティ画面を表示させます。

モジュール用プロジェクト ModuleTest のプロパティ画面表示

左側の Categories から Libraries を選び、右側の Compile タブを表示します。Compile-time Libraries で Modulepath の行右側の ボタンをクリックして、メニューから Add Library... を選びます。

Add Library のダイアログで、あらかじめ登録しておいた JavaFX を選択して Add Library ボタンをクリックして追加します。

Modulepath に JavaFX ライブラリが追加されたことを確認してから OK ボタンをクリックして Project Properties - ModuleTest のウィンドウを閉じます。

JavaFX ライブラリの追加

モジュールの作成

次に、再度作成したプロジェクト ModuleTest を選択、右クリックしてプロダウンメニューを表示、New → Module を選択して新しいモジュールを作成します。

モジュールの作成

ここでは Module Name を javafxApp として Finish ボタンをクリックします。

モジュール javafxApp モジュールの作成

するとモジュール定義ファイル module-info.java がクラスディレクトリ ModuleTest/src/javafxApp/classes のトップに生成されて、右側のエディタのペインに表示されます。

空のモジュール定義ファイル module-info.java

生成された module-info.java には、以下のように依存するモジュールと公開するモジュールを記述します。

リスト:module-info.java 

記述後の module-info.java は以下のようになります。

モジュール定義ファイル module-info.java

以前のプロジェクトで利用していたパッケージを ModuleTest プロジェクトへコピーします。

既存のパッケージを ModuleTest プロジェクトへコピー

メインプロヘクト、メインクラスの指定とコンパイル、実行

メニューバーから Run → Set Main Project から ModuleTest を選んでメインプロジェクトに設定します。

メインプロジェクトの設定

再び、左側のプロジェクトのペインで ModuleTest を選択、右クリックしてプロダウンメニューを表示、Properties を選択してプロジェクトのプロパティ画面を表示させます。左側の Categories から Run を選び、右側の Main Class のエントリに起動するメインクラス javaversion.JavaVersion を入力して OK ボタンをクリック、プロパティ画面を閉じます。

メインクラス javaversion.JavaVersion の設定

キーボード F6 を押して、プロジェクトをコンパイル、実行します。

Fedora 29 上での JavaFX 11 アプリケーション実行例

JavaVersion プロジェクトのソースコード

ご参考までに、今回使用した JaveVersion プロジェクトのソースコードとイメージを紹介しておきます。

リスト:JavaVersion.java 

リスト:JavaVersion.css 

image/java-logo.png

参考サイト

  1. JDK 11 Release Notes, Important Changes, and Information
  2. JavaFX 11がリリース - クロスプラットフォームのGUIライブラリ | ソフトアンテナブログ
  3. JDKの新しいリリース・モデル、および提供ライセンスについて
  4. openjdk-jfx/release-notes-11.md at jfx-11 · javafxports/openjdk-jfx
  5. netbeans - JavaFX deployment library not found in active JDK - Stack Overflow
  6. JavaFX - Gluon
  7. JavaFX (https://openjfx.io/)
  8. bitWalk's: Apache NetBeans 9.0

 

ブログランキング・にほんブログ村へ
にほんブログ村

2018-09-30

R Shiny を使ってみる (5)

Shiny は R のパッケージの一つで、 このパッケージを使うと R を用いて対話的に操作する Web アプリケーションを作成することができます。Web 上のユーザーインタフェース部分を司る ui.R と、内部動作を司る server.R の二つの R 言語スクリプトで、サーバーサイドのコンテンツを作成できることが大きな特徴です。

参考サイト [1] より引用

RStudio 上で Shiny による Web アプリケーションを作り始めたので、理解したことを備忘録としてまとめたことを不定期に紹介していきます。

自分が R を使って解析したい特定の分野について、Web アプリケーションを作成し、参考サイト [2] にある Shiny Server を Linux で稼働させて、作った Web アプリケーションを利用できるようにすることが目標です。しかし現時点では、その Web アプリケーションを作るだけの知識が伴っていないので、しばらくの間、簡単なサンプルで試行錯誤を続けて、判ったことをまとめていきたいと思います。

本記事で使用している動作環境は次の通りです。

  • OS: Fedora 29 beta (x86_64)
  • R: R-core-3.5.1-1.fc29.x86_64, R-core-devel-3.5.1-1.fc29.x86_64
  • RStudio: rstudio-server-1.1.456-1.x86_64

Web App の作成 : Iris explorer ver. 3.0

前回の Shiny の記事 [3] で紹介した Iris explorer ver. 2.1 をベースにして、shinydashboard パッケージを用いたレイアウトに変更してみました。

まず、実行例を以下に示しました。

Iris explorer ver. 3.0 の実行例

shinydashboard パッケージによるレイアウト

shinydashboard パッケージによるレイアウトの基本構成は以下のようになっています。

リスト:ダッシュボードの基本構成 (ui.R) 
library(shiny)
library(shinydashboard)

dashboardPage(
  dashboardHeader(),  # ヘッダー部分
  dashboardSidebar(), # サイドバー部分
  dashboardBody()     # ボディー(メイン)部分
)
Shiny Dashboard の基本構成

ヘッダー部分は、このアプリケーションではアプリケーション名を文字列で定義しているだけです。

リスト:ダッシュボードのヘッダー部分 
dashboardPage(
  dashboardHeader(title = "..."),
    ...
    ...
)

ちなみに、ヘッダーのタイトル右側にある ☰ をクリックするとサイドバーの部分を非表示/表示にすることができます。

サイドバーの表示/非表示

左側のサイドバーの部分には、メニュー (sideBarMenu) を利用してメニューアイテム (menuItem) とその下にサブメニュー (menuSubItem) を定義しています。このサブメニューで、サブメニューに表示する文字列と、サブメニューをクリックした時にボディー(メイン)の部分に表示するタブの名前を定義しています。このタブの名前は、ボディーの部分で対応させます。

リスト:ダッシュボードのサイドバー部分 〜 メニューのタブの設定 
dashboardPage(
    ...
  dashboardSidebar(
    sidebarMenu(
      menuItem(
        "Menu Name",
        menuSubItem("Sub Menu Name 1", tabName = "Tab Name 1"),
        menuSubItem("Sub Menu Name 2", tabName = "Tab Name 2"),
           ...
           ...
        menuSubItem("Sub Menu Name N", tabName = "Tab Name N")
      )
    )
  ),
    ...
)

ボディーの部分には、サイドバーで定義したタブの名前に対応するタブアイテム (tabItem) を定義して、そこに表示するプロットやウィジェットのレイアウトを記載します。

リスト:ダッシュボードのボディー部分 〜 タブ画面のレイアウト 
dashboardPage(
     ...
     ...
  dashboardBody(
    tabItems(
      tabItem(
        "Tab Name 1",
           ...
           ...
      ),
      tabItem(
        "Tab Name 2",
           ...
           ...
      ),
         ...
         ...
      tabItem(
        "Tab Name N",
           ...
           ...
      )
    )
  )
)

サンプルコード

このサンプルのコードを紹介します。今回は global.R を加えた以下の三種類のファイルです。この global.R はアプリケーションが起動する前に実行されます。global.R で生成されたオブジェクトは ui.Rserver.R からアクセスできます [4]

  1. global.R
  2. ui.R
  3. server.R

global.R を以下に示しました。パッケージのロードとアプリケーションのバージョン情報および ggplot2 で使用する共通のテーマを記載しています。

リスト:global.R 

ui.R を以下に示しました。

リスト:ui.R 

server.R を以下に示しました。この部分は、前回の Shiny の記事 [3] で紹介した Iris explorer ver. 2.1 の server.R と同じ内容です。

リスト:server.R 

まとめ

以上、簡単なサンプルでも shinydashboard パッケージを利用すれば、格好の良いレイアウトで簡単に実行できるようになるので、もしかしたら自分でも実用的なスバラシいアプリを作ることができるかもしれない、という幻想を抱かせてくれます…もとい、開発意欲を駆り立ててくれます。

実際に本格的なアプリケーションを構築しようとすれば、いろいろな問題に直面することが予想されますが、とにかく業務で使っている R のコードを Shiny で動くようにすることを検討しています。ひきつづき本ブログ記事では、関連する情報を簡単なサンプルを使って備忘録的にまとめていきたいと考えています。

参考サイト

  1. Shiny - RjpWiki
  2. Download Shiny Server - RStudio
  3. bitWalk's: R Shiny を使ってみる (4)
  4. An introduction to global.R - Learning Shiny

 

ブログランキング・にほんブログ村へ
にほんブログ村

2018-09-28

Java 11 リリース

Java 11 が米国時間 9 月 25 日付で Oracle 社からリリースされました。

Oracle 社は 2017年に 6ヵ月ごとのリリーススケジュールを発表していますが、今回の JDK 11 はこのスケジュールに沿った最初の長期サポート版 (LTS, Long Term Support ) になります。次の LTS 対象の Java が登場するのは、3 年後 2021 年 9 月に登場する予定の Java 17 になります。

Java 11 の新機能については、下記の参考サイトを参照してください。今回のリリースがこれまでと違う点は、これまで無償で提供されてきた Oracle JDK へのバグフィクスやセキュリティパッチが、Java 11 からは有償サポートを結んだユーザーに対してのみ提供されるようになったことです。多くの Linux ディストリビューションでは無償の OpenJDK をビルドしたパッケージが採用されているので、Linux を使う限り Oracle JDK のサポートの有償化の影響を受けませんが、Windows 上でどうするか、個人的には悩ましいところです。

LTS 版を長く使い続けずに 6ヶ月毎にリリースされる JDK に追従していくのであれば、以前とそれほど状況が変わらないようにも思うのですが、この機に OpenJDK の様々なビルドを試してみたいとも考えています。

参考サイト

  1. Java 11正式版がリリース、本バージョンからOracle JDKのサポートは有償に。OpenJDKで無償の長期サポート提供は現時点で期待薄 - Publickey
  2. Oracle、「Java SE 11(JDK 11)」の一般提供を開始:2026年までアップデートが提供される長期サポートリリース - @IT
  3. 有料化Java SEの新ライセンス体系、米オラクルが公表  :日本経済新聞
  4. オラクル Java SE Subscription FAQ

 

ブログランキング・にほんブログ村へ
にほんブログ村

2018-09-27

R Shiny を使ってみる (4)

Shiny は R のパッケージの一つで、 このパッケージを使うと R を用いて対話的に操作する Web アプリケーションを作成することができます。Web 上のユーザーインタフェース部分を司る ui.R と、内部動作を司る server.R の二つの R 言語スクリプトで、サーバーサイドの style="font-size:small;"コンテンツを作成できることが大きな特徴です。

参考サイト [1] より引用

RStudio 上で Shiny による Web アプリケーションを作り始めたので、理解したことを備忘録としてまとめたことを不定期に紹介していきます。

自分が R を使って解析したい特定の分野について、Web アプリケーションを作成し、参考サイト [2] にある Shiny Server を Linux で稼働させて、作った Web アプリケーションを利用できるようにすることが目標です。しかし現時点では、その Web アプリケーションを作るだけの知識が伴っていないので、しばらくの間、簡単なサンプルで試行錯誤を続けて、判ったことをまとめていきたいと思います。

本記事で使用している動作環境は次の通りです。

  • OS: Fedora 28 (x86_64)
  • R: R-core-3.5.0-4.fc28.x86_64, R-core-devel-3.5.0-4.fc28.x86_64
  • RStudio: rstudio-1.1.456-1.x86_64

Web App の作成 : Iris explorer ver. 2.1

前回の Shiny の記事 [3] で紹介した Iris explorer ver. 2 のレイアウトをベースにして、細かい改良を加えました。

実行例を以下に示しました。

Iris explorer ver. 2.1 の実行例

このサンプルのコードを紹介します。

まず、ui.R を以下に示しました。

リスト:ui.R 

散布図 (Scatter) と 密度の等高線図 (Density2D) を統合しました。各タブ画面 (tabPanel) で、プロット部分より下の部分を column() 関数で左右 2 つに分け、従来の selectInput() 関数などの変数を選択する部分と、チェックボックスあるいはラジオボタンを用いたプロットオプション設定する部分にしました。

また、ヒストグラムで、縦軸を頻度 (Frequency) か密度 (Density) にするかを選択するラジオボタンでは、密度 (Density) を選ぶと、密度曲線 (density estimate) を表示するかどうかのチェックボックスが表示されるように conditionalPanel() 関数を使ってみました(下記コード)。

conditionalPanel の使用例

次に、server.R を以下に示しました。

リスト:server.R 

こちらは、基本的にはプロットする処理が並んでいるだけで、それぞれ、input に紐づけられた変数の変化に応じて(再)描画する処理を実行するようになっているだけなのですが、オプションでプロットの方法を変えているため、例えば下記の散布図 (Scatter) のように、if 文を入れて、チェックボックスあるいはラジオボタンの選択状態によって表示が変化するようにしています。

まとめ

今回は、コードの説明が雑になってしまっているように思うので、時間のあるときに少しずつ手直しをしていきます。

Shiny を利用した R の Web アプリの作り方の初歩が大体判ったので、次はダッシュボード (shinydashboard) を利用した Web アプリ作りに挑戦したいと思っています。

参考サイト

  1. Shiny - RjpWiki
  2. Download Shiny Server - RStudio
  3. bitWalk's: R Shiny を使ってみる (3)

 

ブログランキング・にほんブログ村へ
にほんブログ村

2018-09-21

R Shiny を使ってみる (3)

Shiny は R のパッケージの一つで、 このパッケージを使うと R を用いて対話的に操作する Web アプリケーションを作成することができます。Web 上のユーザーインタフェース部分を司る ui.R と、内部動作を司る server.R の二つの R 言語スクリプトで、サーバーサイドのコンテンツを作成できることが大きな特徴です。

参考サイト [1] より引用

RStudio 上で Shiny による Web アプリケーションを作り始めたので、理解したことを備忘録としてまとめたことを不定期に紹介していきます。

本記事で使用している動作環境は次の通りです。

  • OS: Fedora 28 (x86_64)
  • R: R-core-3.5.0-4.fc28.x86_64, R-core-devel-3.5.0-4.fc28.x86_64
  • RStudio: rstudio-1.1.456-1.x86_64

自分が R を使って解析したい特定の分野について、Web アプリケーションを作成し、参考サイト [2] にある Shiny Server を Linux で稼働させて、作った Web アプリケーションを利用できるようにすることが目標です。しかし現時点では、その Web アプリケーションを作るだけの知識が伴っていないので、しばらくの間、簡単なサンプルで試行錯誤を続けて、判ったことをまとめていきたいと思います。

Web App の作成 : Iris explorer ver. 2

前回の Shiny の記事 [3] で紹介した Iris explorer のレイアウトを変更してプロットを追加しました。

Web アプリケーションでは、限られた面積の中でより多くの情報にアクセスできるようにやりくりしなければなりません。そのため Shiny ではいくつかのレイアウトを利用できるようになっていますが、今回は navlistPaneltabPanel を組み合わせてみました。

まず、実行例を以下に示しました。

Iris explorer ver. 2 の実行例

画面の左側にナビゲーションリストが表示されており、リストのアイテムをクリックすると、そのアイテムに対応した内容が画面右側に表示されるという構成です。これで画面のスクロールバーを動かすことなく、複数のプロットを表示できるようになりました。

このサンプルのコードを紹介します。

まず、ui.R を以下に示しました。

リスト:ui.R 
library(shiny)

fluidPage(
    titlePanel("Iris explorer ver. 2"),
    navlistPanel(
        widths = c(2, 10),
        # Scatter plot
        tabPanel(title = "Scatter",
                 plotOutput("scatter"),
                 selectInput(
                     inputId = "scatX",
                     label = "Select the X variable",
                     choices = c("Sepal.Length" = 1, "Sepal.Width" = 2, "Petal.Length" = 3, "Petal.Width" = 4)),
                 selectInput(
                     inputId = "scatY",
                     label = "Select the Y variable",
                     choices = c("Sepal.Length" = 1, "Sepal.Width" = 2, "Petal.Length" = 3, "Petal.Width" = 4), selected = 2)
        ),
        # Density plot
        tabPanel(title = "Density2D",
                 plotOutput("dense"),
                 selectInput(
                     inputId = "denseX",
                     label = "Select the X variable",
                     choices = c("Sepal.Length" = 1, "Sepal.Width" = 2, "Petal.Length" = 3, "Petal.Width" = 4)),
                 selectInput(
                     inputId = "denseY",
                     label = "Select the Y variable",
                     choices = c("Sepal.Length" = 1, "Sepal.Width" = 2, "Petal.Length" = 3, "Petal.Width" = 4), selected = 2)
        ),
        # Boxplot
        tabPanel(title = "Boxplot",
                 plotOutput("box"),
                 selectInput(
                     inputId = "boxY",
                     label = "Select the Y variable",
                     choices = c("Sepal.Length" = 1, "Sepal.Width" = 2, "Petal.Length" = 3, "Petal.Width" = 4))
        ),
        # Histogram
        tabPanel(title = "Histogram",
                 plotOutput("hist"),
                 selectInput(
                     inputId = "histX",
                     label = "Select the X variable",
                     choices = c("Sepal.Length" = 1, "Sepal.Width" = 2, "Petal.Length" = 3, "Petal.Width" = 4)),
                 sliderInput(
                     inputId = "bins",
                     label = "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 25)
        )
    )
)

画面の基本レイアウトは fluidPage を用いた、行 (row) の中に列 (column) を定義していく構成です。その一行を navlistPanel が占め、その中で複数の tabPanel のパネルを切り替えて表示するという作りです。

tabPanel 関数の title = "..." で指定した文字列が画面左側に列挙され、クリックしたら定義されている内容が表示されます。パネルなどで指定しなければ、複数のプロットあるいはウィジェットは順番に縦方向に右側のパネルに配置されます。

次に、server.R を以下に示しました。

リスト:server.R 
library(shiny)
library(ggplot2)

gtheme <- theme(
    axis.title = element_text(size = 16),
    axis.text = element_text(size = 16),
    axis.line = element_line(),
    legend.title =  element_text(size = 14),
    legend.text = element_text(size = 14),
    panel.grid.major = element_line(colour = "grey", size = rel(0.5)), 
    panel.grid.minor = element_blank(), 
    panel.background = element_rect(fill = "whitesmoke")
)

function(input, output) {
    # -------------------------------------------------------------------------
    # Scatter plot
    # -------------------------------------------------------------------------
    x.scat <- reactive(iris[, as.numeric(input$scatX)])
    y.scat <- reactive(iris[, as.numeric(input$scatY)])
    xl.scat <- reactive(names(iris[as.numeric(input$scatX)]))
    yl.scat <- reactive(names(iris[as.numeric(input$scatY)]))
    output$scatter <- renderPlot({
        p <- ggplot(data = iris, aes(x = x.scat(), y = y.scat(), colour = Species))
        p <- p + xlab(xl.scat()) + ylab(yl.scat())
        p <- p + geom_point(size = 4) 
        p <- p + gtheme
        plot(p)
    })
    
    # -------------------------------------------------------------------------
    # Density2d plot
    # -------------------------------------------------------------------------
    x.dense <- reactive(iris[, as.numeric(input$denseX)])
    y.dense <- reactive(iris[, as.numeric(input$denseY)])
    xl.dense <- reactive(names(iris[as.numeric(input$denseX)]))
    yl.dense <- reactive(names(iris[as.numeric(input$denseY)]))
    output$dense <- renderPlot({
        p <- ggplot(data = iris, aes(x = x.dense(), y = y.dense(), colour = Species))
        p <- p + xlab(xl.dense()) + ylab(yl.dense())
        p <- p + geom_density2d(size = 1) 
        p <- p + gtheme
        plot(p)
    })
    
    # -------------------------------------------------------------------------
    # Boxplot
    # -------------------------------------------------------------------------
    y.box <- reactive(iris[, as.numeric(input$boxY)])
    yl.box <- reactive(names(iris[as.numeric(input$boxY)]))
    output$box <- renderPlot({
        p <- ggplot(data = iris, aes(x = Species, y = y.box(), color = Species))
        p <- p + ylab(yl.box())
        p <- p + geom_boxplot(size = 1, outlier.size = 4)
        p <- p + gtheme
        plot(p)
    })

    # -------------------------------------------------------------------------
    # Histgram
    # -------------------------------------------------------------------------
    x.hist <- reactive(iris[, as.numeric(input$histX)])
    xl.hist <- reactive(names(iris[as.numeric(input$histX)]))
    output$hist <- renderPlot({
        p <- ggplot(data = iris, aes(x = x.hist()))
        p <- p + geom_histogram(bins = input$bins, color = "black", aes(fill = Species))
        p <- p + xlab(xl.hist()) +  ylab("Frequency")
        p <- p + gtheme
        plot(p)
    })
}

こちらは、プロットする処理が並んでいるだけです。それぞれ、input に紐づけられた変数の変化に応じて(再)描画する処理を実行します。

参考サイト

  1. Shiny - RjpWiki
  2. Download Shiny Server - RStudio
  3. bitWalk's: R Shiny を使ってみる (2)

 

ブログランキング・にほんブログ村へ
にほんブログ村