Rzパッケージ・チュートリアル
移転しました。 http://m884.jp/Rz_Ja.html
* 更新履歴
Rzパッケージの更新履歴
- 2012-02-06 0.3-8 クイックエディタビュー,値ラベル編集機能,キーボードショートカット追加
- 2012-02-01 0.3-6 大幅更新
- 2011-04-04 0.2-1 初版
なお,開発版を次のリンクで公開しています(Windows用バイナリ,ソース)。CRANポリシーによりCRANへのアップロードは月に1回程度に制限されていますので,いち早く最新版を使いたい方はこちらをご利用ください(タイミングによってはCRANに上がっているものと同じバージョンかもしれません)。
このチュートリアルの更新履歴
- 2012-02-07 0.3-8対応
- 2012-02-02 0.3-6対応の初版
動作環境
主にWindowsとLinuxで動作確認をしています。Macは英語のみ,かつ公式GUI以外(ターミナル,ESS,RStudio)の環境で一応の動作確認ができています。公式GUIでは英数字であっても文字化けを起こします。その他の言語については確認できていませんが,少なくとも日本語は表示・入力ともにできません(おそらく中国語,朝鮮語も)。日本語のMacでも,Rを英語設定で立ち上げれば,公式GUI以外で使うことができます。ホームフォルダの.Renvironに LANGUAGE=En を書き足すと,Rを英語設定にすることができます。
また,バージョン2.12以降のRが必要です。バージョン2.12よりも古いRを使っている場合は,こちらから新しいバージョンをダウンロードしてインストールして下さい。
概要
GUIをRに
RzパッケージはSPSSと互換性を保ちつつそれを超えるようなデータ管理環境を目指して開発を行っています。
Rは非常に強力な統計解析環境ですが,グラフィカルユーザーインターフェース(GUI)に関してはいまのところ貧弱と言わざるをえません。GUIなど必要ない,慣れればスクリプトを書いた方が早い,という意見も多く,確かに多くの場面ではそれは真実なのですが,一方でGUIが優位性を持つ場面もやはり存在します。
Rzの主機能であるデータ管理も,そのうちの1つです。例えば社会調査データの場合,1つのデータセットが数十から数百を超える変数を持ちます。このぐらいの数の変数をコンソールで管理するのは,大変な煩わしさが伴います。全ての変数名を正確に覚えきるのは現実的ではありません。また,これだけ変数があると,ある変数がどのような変数だったか確かめるだけでも大変な労力です。短い変数名(あるいは”Q1”のような形式的な変数名)では内容が分かりませんし,かといって長い変数名をつけると分析の際に不便です。結局,対処としては変数情報を一覧できる他のソフト(ExcelやSPSS)をRと並行して立ち上げる,というような方法になってしまいます。
このような煩わしさを解消することが,Rzの開発目的の1つです。
memiscパッケージを取り込んだRzのデータ管理機能
Rzは,しかし,単なる変数閲覧パッケージではありません。Rzの本質は,memiscパッケージの機能の組み込みにあります。memiscパッケージは,変数ラベル,値ラベル,尺度の管理,ユーザー欠損値といった,SPSS等の持つデータ管理機能をRでも使えるようにする強力なパッケージです。つまり,memicのフロントエンドとしてのGUIを構築することで,SPSS等のグラフィカルな統計解析パッケージと同等以上の機能をRにもたらすのが,Rzパッケージです*1。SPSSはよくRと比較され,どちらがより優れているのか様々な意見が交わされていますが,もしSPSSのバックエンドが完全にRになったとしたら,それはすばらしいソフトだと思いませんか?
初心者向け?
Rzはこのような成り立ちのソフトであるため,GUIを提供するといっても,必ずしもRの初心者向けとして作られたわけではありません。例えば,SPSS等のような統計解析のインターフェースはありません。統計解析は,スクリプトを書いてコンソールベースで行った方が効率的だと考えるからです。つまり,コンソールが優位な場面ではコンソールを,GUIが優位な場面ではGUIを使う,というのがRzの設計思想です。
とはいえ,例えばSPSS等から乗り換える際に,Rzを使えばmemiscのSPSS互換機能によって多くの障害が取り除かれるのは確かですし,それも開発目的の1つではあります。しかし,それにとどまらず,むしろ中級者以上のRユーザーのデータ分析の効率を高めることが,Rzの主たる開発目的です。
このような目的であることから,Rzはクリックしていくだけでなんでもできるわけではなく,利用者はRの基本的な使い方を学んでおく必要があります。そしてその次のステップとしてmemiscパッケージの使い方を学ぶことで,柔軟かつ効率的にデータを管理し,分析により多くの力を注ぐことができるようになるでしょう。
memiscパッケージの使い方については,ビネットや,私が過去に作った資料(PDF)があります。また,Rパッケージガイドブックにより詳しい解説を書いています。
プロット機能
さらにRzは,実用的なプロット機能を搭載しています。Rでグラフを作成するとき,作りたいグラフは完璧に頭の中にあるのに,それがうまく作れずに頭を悩ませた経験はありませんか? Rのプロット機能は多彩で強力ですが,そのぶん複雑で,作成するグラフごとに異なる様々なオプションを把握するのは楽ではありません。
Rzはggplot2をバックエンドに使い,美しいグラフを簡単な操作で作成することを可能にしています。
インストール
Rzパッケージと,依存パッケージをインストールします。
install.packages("Rz")
依存パッケージとしてRGtk2パッケージがインストールされます。RGtk2パッケージは,別途GTK+をダウンロードする必要があります。以降,GTK+のダウンロード手順を説明します。
まず,RGtk2パッケージを読み込むと,以下のようなエラーが出ます。
> library(RGtk2) Error in inDL(x, as.logical(local), as.logical(now), ...) : 共有ライブラリ 'C:/home/masahiro/R_library/RGtk2/libs/i386/RGtk2.dll' を読み込めません: LoadLibrary failure: 指定されたモジュールが見つかりません。
さらに,ダイアログでGTK+のインストールを促されます。そのままOKを押し,GTK+をダウンロードして下さい。
ダウンロードが始まります。
URL 'http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip' を試しています Content type 'application/zip' length 24516284 bytes (23.4 Mb) 開かれた URL downloaded 23.4 Mb
ダウンロードが終了すると,以下のようなメッセージが出ますので,Rを再起動して下さい。
Learn more about GTK+ at http://www.gtk.org If the package still does not load, please ensure that GTK+ is installed and that it is on your PATH environment variable IN ANY CASE, RESTART R BEFORE TRYING TO LOAD THE PACKAGE AGAIN 警告メッセージ: Failed to load RGtk2 dynamic library, attempting to install it.
再起動後,以下のスクリプトを実行し,何もないウィンドウが出れば,インストールは完了です。
library(RGtk2) gtkWindowNew()
起動
インストール後,起動は以下のようにするだけです。
library(Rz) Rz()
または,メニューバーからも起動できます。
起動すると,以下のようなウィンドウが立ち上がります。
データの読み込み
作業環境からのデータの読み込み
「大局的環境からインポート」では,すでに作業環境にあるデータをRzに読み込むことができます。読み込めるデータは,data.frameかdata.setです。
試しに,irisを読み込んでみて下さい。まず,次のスクリプトを実行すると,組み込みデータのirisが大局的環境にロードされます。
data(iris)
メニューバーのファイルかツールバーの「大局的環境からインポート」を選び,ドロップダウンメニューからirisを選択してください。
コンソールで以下のスクリプトを実行すると,dataset1という名前の,irisと全く同じ中身のdata.frameができていることが分かります。これはRzに読み込んだirisが,dataset1という名前で大局的環境に出力されたものです。Rz上でのデータの変更は即座に大局的環境に反映されるので,Rz上でデータ管理を行い,出力されたデータを分析に用いる,というのがRzの基本的な使い方です。
> ls() [1] "dataset1" "iris" > summary(dataset1) Sepal.Length Sepal.Width Petal.Length Petal.Width Species Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50 Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50 Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800 Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500 > all.equal(iris, dataset1) [1] TRUE
ファイルからのデータの読み込み
メニューバーのファイルかツールバーの「開く」を選ぶと,ファイルからデータを読み込むことができます。
現在の対応形式は,独自形式のRz Dataファイル(*.rzd),SPSSシステムファイル(*.sav),SPSSポータブルファイル(*.por),Stataファイル(*.dta)コンマ区切りテキスト(*.csv),タブ区切りテキストです。
ファイルの文字コードがRの文字コードと異なる場合は,エンコーディングからファイルの文字コードを選択して下さい。
コンマ区切りテキスト,タブ区切りテキストを読み込むときは,ヘッダの有無(一行目が変数名かどうか),欠損値(NA)に割り当てている文字を設定して下さい。
大きなデータは読み込みに時間がかかります。また,文字コードを変換する場合は読み込みに数分かかる場合があります。
データの管理
Rzのデータ管理の基本
読み込んだデータは,ツールバーの下のドロップダウンリストで切り替えることができます。リスト内の左側がデータセット名,右側が読み込んだファイルの名前です。
Rzは大局的環境とは別の場所(パッケージの環境)で独自にデータを管理していることに注意して下さい。Rzの管理しているデータは,データセット名を変数名として,常に大局的環境と同期されますが,同期は基本的に一方向です。つまり,Rz上でのデータの編集は大局的環境に反映されますが,大局的環境でのデータの編集はRz上に反映されません。
大局的環境からリロード
大局的環境で加えた編集をRz上に反映させたい場合,2つの方法があります。1つめは,「大局的環境からリロード」を使う方法です。この機能は単純ですが,非常に強力です。非定型のデータ整形ならばRzで行い,定型のデータ整形ならばスクリプトによって一気に行ってからRzにリロードすることで,GUIとコンソールを効率的に使い分け,生産性を上げることができます。このようなGUIとコンソールの連携が,Rzの大きな特長の1つです。
この機能を使うためには,「memiscパッケージのdata.setとして同期」を有効にしておく必要があります。無効の場合,同期はdata.frameで行われます。data.frameは変数ラベルやユーザー欠損値などの情報を持たないため,Rz上のデータに反映させるとそれらの情報が欠落してしまいます。そのため,データを編集する際には,この設定を有効にしておくことを推奨します。
一方で,data.setは場合によっては分析に用いるのに適しません。data.setは透過的にdata.frameと同じように扱えるようになっていますが,やや処理が遅く,また関数によっては用いることができない場合があります。そのため,分析の際にはこの設定を無効にすることを推奨します。
2つめは,「大局的環境からインポート」を使って別データとして読み込む方法です。こちらはdata.setでもdata.frameでも読み込むことができますが,上記と同様の理由で,data.setから読み込むことを推奨します。
データの操作
変数が並んでいるシートを,変数ビューと呼びます。変数ビューの列は,左から順に,インデックス,変数名,変数ラベル,尺度,値ラベル,ユーザー欠損値です。
変数名は,data.frameの変数名と同じもので,変数にアクセスする際に使います。変数ラベルには,変数のより詳しい説明を記入することができます。
尺度は,nominal,ordinal,interval,ratioから選ぶことができます。分析に用いる際には,nominalはfactor,ordinalはorderd,intervalとratioはnumericに変換されます。
値ラベルは,変数の値にラベルをつけるものです。Rではfactorをカテゴリ変数,numericを量的変数として用いますが,factorにインデックスとして数値を割り当てたり,numericにラベルをつけたりすることはできません。Rzでは,SPSSやStataのようなラベル管理を可能にしています。
ユーザー欠損値は,変数の値を,情報を失わずに欠損値に指定する機能です。Rは通常いったんNAを割り当ててしまうと,元の値を復元することはできません。Rzでは,ユーザー欠損値の機能によって,値を柔軟に欠損値にしたり戻したりすることができます。
データの編集 New!
値ラベル以外は,行を一度選択してから,次に各セルをクリックすると編集できます。尺度は,行を選択後,尺度のセルをクリックし続けると,ドロップダウンリストが現われ,尺度を選択できます。連打するとフリーズするので気をつけて下さい。値ラベルを変更する場合は,変数を右クリックし,値ラベルの変更画面から変更してください。「+」の行に値とラベルを入力することで新しい値ラベルを追加することができ,「-」のセルをダブルクリックすることで値ラベルの削除ができます。
ユーザー欠損値の設定
ユーザー欠損値は,値指定と範囲指定の2種類の方法で設定することができます。
値指定は,ユーザー欠損値に指定したい数値をコンマで区切って入力します。
1, 2, 3, 4, 5
このように指定すれば,1と2と3と4と5がユーザー欠損値に指定されます。また,以下のように指定することもできます。
1:5
これは,1つめの指定方法と同じ結果になります。基本的に,c関数に渡したときに数値ベクトルが返り値となる記述であれば,入力することができます。よって,以下のように交ぜて入力することも可能です。
1:5, 9, 10, 12:15
範囲指定は,以下のように記述します。
range=c(5, 10)
この場合,5以上10以下の値がユーザー欠損値となります。値指定とちがい,6.4や9.8などの小数を含む,範囲内の全ての実数が欠損値となります。
Infを指定することで,無限大の範囲を設定することもできます。
range=c(5, Inf) range=c(-Inf, 3)
範囲指定は,1つの変数につき1つの範囲しか設定することができません。また,値指定と混在させることはできません。
リコード
変数の行で右クリックしてリコードを選択すると,リコードのダイアログが表示されます。
一番上がその変数に存在している値です。その下の左側が変数の値とラベルの対応関係です。ラベルは存在していない値にも付けることができ,反対に値は存在するがラベルはついていない場合があるので,この欄で確認して下さい。
ラベルの欄の右側は,一番上がいまリコードしている変数の名前,その下がリコード結果を保存する変数の名前です。リコード先にリコード元と同じ名前,またはデータセット中に存在する変数名を入力すると,上書きされます。データセット中に存在しない変数名を入力すると,新変数としてデータセットの最後尾に付け加えられます。その下が,変数に設定する変数ラベルです。
その下の「テンプレートの生成」ボタンを押すと,リコードのテンプレートが生成されます。このまま実行すると,全く同じ変数が生成されます。これを書き換えてリコードすることで,素早いリコードが可能です。下の画像が実例です。
この例では,1は1のまま,2と3を2に統合して「中」というラベルを付ける,4と5を3に統合して「下」というラベルを付ける,その他の値はそのまま,となっています。
otherwiseはこの例では意味がありませんが,リコードを指定していない「その他の値」についての処理を記述します。例えば一行目の1の値については,otherwise="copy"を指定しているので,今回の場合消してしまっても同じ結果になります。otherwise=NAにすれば「その他の値」は欠損値になりますし,otherwise=3とすれば「その他の値」はすべて3になります。
量的変数をカテゴリ変数にリコードしたい場合,range記法が便利です。
"低"=1 <- range(min , 40), "中"=2 <- range(40.01, 60), "高"=3 <- range(60.01, max)
このように書くと,最小値から40までが1でラベル「低」,40.01から60までが2でラベル「中」,60.01から最大値までが3でラベル「高」というふうにリコードされます。値を重複させるとエラーになるので気をつけてください。
基本的な書き方はmemiscパッケージのrecode関数と同じです。詳細はhelp(recode)を参照してください。
クイックエディタビュー(クイックエディタ) New!
クイックエディタビューを開くと,以下の画像のような画面が現れます。
上半分には変数ビューでチェックされた変数が一覧されており,下半分が簡易エディタになっています。試しに,irisデータのSepal.Length〜Petal.Widthの4変数にチェックを入れ,エディタに,
print(summary(df.orig)) cor(df)
と入力して「実行」ボタンを押すかキーボードでControl+Rを押してみてください。
コンソールに,下の画像のような出力がされます。
クイックエディタでは,もとのデータにdf.origという名前で,選択した変数のみに変数をしぼったデータ(今回でいえばiris[1:4]というデータ)にdfという名前でアクセスすることができます。クイックエディタを使えば,定型の出力を変数を入れ替えながら探索的に見る,というような作業の効率が大幅にアップします。
注意点として,クイックエディタで得られる出力は基本的に最後の関数の出力のみです。それ以外の出力を得たい場合は,能動的にprint関数などを使う必要があります。また,関数の戻り値を保存したい場合は,「<-」の代わりに「<<-」という代入記号を使えば,大局的環境に戻り値を保存することができます。
クイックエディタビュー(クイック変数エディタ) New!
クイックエディタビューのもう1つの機能,クイック変数エディタでは,チェックした変数に定型の加工を施し,データに反映させることができます。
変数の加工について,いくつかのテンプレートも用意してあります。まずは,クイックエディタのときと同じように4変数にチェックを入れ,テンプレートから「尺度を変更する」を選んでみてください。エディタに,
measurement(var) <- "ratio"
と入力されます。「実行」ボタンを押すかキーボードでControl+Rを押してみてください。
変数ビューを見ると,チェックを入れた4変数の尺度が「ratio」に変わっているはずです。
クイック変数エディタの仕組みは単純で,チェックされた変数は順番にvarという変数に代入され,処理を加えられたのちに元の変数に上書きされる,というものです。この処理にはmemiscパッケージのforeachという関数を使っています。
クイック変数エディタの注意点として,memiscの関数を使わない処理では多くの場合,変数ラベル・値ラベル・ユーザー欠損値などの情報が欠落してしまいます。やや面倒ですが,例えば下の画像のように処理を加える前にいったん変数ラベルなどを変数に保存しておくことで,欠落を防ぐことができます。
データの閲覧
行にカーソルを合わせると,変数のsummaryがポップアップします。行をダブルクリックすると,より詳しい要約がコンソールに表示されます。これはmemiscパッケージのcodebookという関数を使っています。
ポップアップは設定で無効にすることもできます。
データビュー
データビューを選択すると,生データを見ることができます。今のところ,見ることしかできません。
データの保存
「別名で保存」を選択すると,データを保存することができます。
独自形式の「Rz Dataファイル」で保存すると,全ての情報を保ったまま保存し,再度読み込むことができます。「SPSSシンタックスとCSV」で保存すると,CSVと,CSVを読み込むためのSPSSシンタックスが出力されます。「Stata DoファイルとCSV」で保存すると,CSVと,CSVを読み込むためのDoファイルが出力されます。「Stataファイル」で保存すると,Stataのdta形式のファイルで保存されます。コンマ区切りテキスト,タブ区切りテキストで保存すると,それぞれコンマ区切り,タブ区切りのCSVで保存されます。ファイルを開くときと同様,ヘッダの有無(一行目が変数名かどうか),欠損値(NA)に割り当てる文字を設定して下さい。
プロットビュー
プロットビューでは,ggplot2パッケージを用いた柔軟で美麗なグラフを出力することができます。
プロットビューを有効にすると,ggplot2の様々なオプションを設定する領域が現れます。ggplot2の多くの機能の中から,主要なものを使いやすくまとめてあります。軸や凡例のラベルには,データセット内の変数の変数名や変数ラベルを簡単に設定することができます。変数名を入力する際には,オートコンプリ−ションが働き,入力ミスを防ぎつつ素早く変数名を入力することができます。
まずは,なにもオプションを設定せずに,変数のインデックスをダブルクリックしてみてください。カテゴリ変数であれば棒グラフ,量的変数であればヒストグラムが出力されます。プロットビューでは,変数のインデックスをダブルクリックすることでプロットを出力します。これは変数の詳しい要約をコンソールに出力するときと同じ操作です。
もし,プロットビューを開いているときには要約を出力してほしくないのであれば,設定を変えることができます。
プロットビューの使い方
プロットビューの機能のほとんどはggplot2に基づいていますが,ggplot2はとても高機能なパッケージであるため,その解説は Rzパッケージのチュートリアルの範囲を超えます。とはいえ,ggplot2の基本的な使い方さえ覚えれば,プロットビューを使うのはとても簡単です。逆に,とりあえずプロットビューをいじって感じをつかんでから,本格的にggplot2を勉強する,というのも有効だと思います。
ggplot2は,公式サイトが非常に充実しています。また,作者による書籍およびその訳書も販売されています(ただし,シュプリンガー・ジャパンの撤退にともない,訳書は現在品薄になっています。そのうち事業譲渡先の丸善から発売されると思いますが,いつになるか分からないので,書店で発見したときは迷わず買いましょう)。また,ウェブページ,ブログ記事,勉強会の資料などもとてもたくさんあるので,検索してみてください。
例えば下の画像のような美しいグラフを,変数の指定とマウスクリックだけで出力することができます。
プロットビューでは,出力した画像を簡単に保存することができます。また,保存のフォーマットも豊富です。
その他の設定
テーマセレクタ
好みのテーマをダウンロードし,適用することができます。まず,テーマを入れるフォルダを好きなところに作り,設定画面でテーマフォルダを設定して下さい。次に,Gtk+2テーマをダウンロードしてきます。テーマはGNOME-LOOK.ORGからダウンロードできます。Gtk+3テーマとして配布されているものの中にも,Gtk+2テーマを含んでいるものがあります。ダウンロードしたテーマを,以下のような階層になるように,テーマフォルダに格納します。
"テーマフォルダ/テーマ名のフォルダ/gtk-2.0/gtkrc"
再び設定画面を開くと,テーマを選択できるようになっています。テーマの変更は,R本体を再起動するまで適用されません。
注意点として,pixmap以外のテーマエンジンを使っているテーマは,ほとんどが正しく表示されません。問題なく表示されるテーマをいくつかピックアップしたので,参考にして下さい。
Aero-clone |
Azel |
Candido |
Detour E17-GTK2 |
ElegantBrit gtk3 |
kde4.2-oxygen (modified) |
Mac4Lin |
MacOS-X Aqua Theme |
Orta |
SlicknesS |
埋め込みグラフィックスデバイス
埋め込みグラフィックスデバイスを使うと,ウィンドウ内部にプロットを埋め込むことができます。ただし,Windowsでは一部プロットが正常に表示されません(facetが正しく描画されないことを確認しています)。おそらく埋め込みに使用しているcairoDeviceパッケージのバグだと思われます。
この設定の変更は,Rzをいったん閉じ,再度Rz()を実行するまで反映されません。
フォントの設定
Rzでは画面表示やプロットに用いるフォントを指定することができます。特にプロットのフォント指定は通常は煩雑な手続きが必要ですので,利便性を大きく高める機能の1つだといえるでしょう。PDFのフォントとPostScriptのフォントについては,プロットをそれぞれの形式で保存するときにのみ用いられます。
今後の予定
順不同です。優先順位が高くないものも含まれています。要望をいただければ優先順位を上げます。
- ログ機能
- スクリプトでRzを操作できるようにする
- ラベル等をファイルから読み込み
- 簡易レポート作成機能
- plot履歴
- エラーバーなどの実装
- 変数の計算
- ポップアップ改善
- 変数にタグ
- クロス集計表
- ワーディング管理
- ケースの選択
- 最近使ったファイル
情報求む!
バグ報告・要望・質問・感想・批判等
全て大歓迎です。機能追加の要望があれば,内容によりますが可能なかぎり優先的に実装します。
twitter(@phosphor_m)かメール(rinm884@gmail.com)かコメントでよろしくお願いします。
*1:実際,Rzパッケージの開発初期はmemiscGUIという名前でした。
大阪大学人間科学部同窓会機能停止問題についてわかったこと
人科同窓会のウェブサイトには何の情報もないので各所に聞いて回りました。
同じ問題で迷子になっている同窓生のためにメモっておきます。
- 機能は停止しているが完全に消滅したわけではない(運営主体?は一応存続しているらしい)
- 人科の学生支援室で確認済み
- 人間科学部および人間科学研究科の卒業生は,自動的に同窓会に入会したものとみなされる
ということで,同窓会が停止していることで直接的に権利の制限などの不利益を被ることはなさそうです。ただし,入会金・年会費の類いはプールされたまま宙に浮いている状態のようです。これは機能停止前に支払っていた世代にとっては直接的な不利益になります。
ただ入会金・年会費がどのくらいの金額でどのように徴収していたのか,もしくはそもそも徴収していなかったのか,といったことは分かりませんでした。よってどのくらいプールされているのかも検討がつきません。そもそも停止するまでの活動実体も知らないので…。いまでも生協出資金から返還時に入会金が引かれているという話もあったのですが,それは任意で同窓会連合会の入会金に回せるという話のほうではないかと思います。
裏は取れておらず推測も含むので詳細は書きませんが,もともと細々とした運営だったものが,人科内で同窓会業務を担当していた方が2007年度〜2009年度あたりに転出したようで,それにともなって完全に機能停止したのではないかと思います。私は学部2007年度卒ですが,卒業時に同窓会の案内があった記憶はありませんし,2009年度の修士修了時にも何もなかったと思います。
私としては,自分が同窓会員なのか否かを確認するという当初の目的は果たしたので,これ以上どうこうしようという気はありません。ただ,一方ではハービスOSAKAにサロンまで持ってる同窓会もあるのに,自分の同窓会が虫の息というのはさすがに悲しいですね。といっても虫の息とはいえ死んではいないのなら新たに作るわけにもいかないので,復活を待つしかなさそうです。できることといえば,この問題を同窓生に周知することぐらいでしょうか。声が集まれば状況が変わるかもしれません。
もともとは大阪大学会館の施設を借りられないかと思って調べ始めたことですが,思わぬ展開でした。ちなみに大阪大学会館のほうは,同窓会員が使えるのは基本的に同窓会主催で何かやるときだけのようです。残念。
utilsパッケージより小ネタ集(R Advent Calendar 2011 7日目)
alarm
ではみなさん,おもむろに下のスクリプトを実行してください。
alarm()
音が出ましたね。それだけです。
R Advent Calendar 2011のレベルが高すぎて泣きそうです。でも開き直って,しょーもない小ネタでお茶を濁したいと思います!
ということで,utilsパッケージをざーっと眺めて,目に付いたものを紹介していきたいと思います。
ちなみにさきほどのalarm関数ですが,関数を使わなくとも,文字列で実現できます。alarmの中身を見れば分かりますが,
cat("\a")
これだけで音が出ます。これをcolnamesとかに仕込んでいたずらを…と思ったんですがうまくいきませんでした。
apropos
知ってる人が多いと思いますが。aproposはオブジェクトを検索する関数です。うろ覚えの関数を探すのに便利です。
apropos("sum")
いろいろ合計する関数がありますね。summaryも交ざっちゃってますが。よくわからない変数なんかも交ざってきますが,modeを指定することで,関数限定で検索することもできます。
apropos("sum", mode="function")
個人的には,適当に名前の当たりをつけて,こんな関数ないかなーっていうのを探すことも多いです。
例えばtestで検索すると,いろんな検定用関数が出てきます。
apropos("test", mode="function")
文字列を操作したいけどなんか良い関数あったっけ?ってときは下のような検索をしたり。
apropos("char", mode="function") apropos("str", mode="function")
browseVignettes
browseVignettes関数を実行すると,インストール済みパッケージのvignette一覧をブラウザで見ることができます。
browseVignettes()
vignetteは重要な情報源なのですが,積極的に探さないかぎり行き当たらないのが難点です。いつのまにか改訂されてたり,追加されてたりしますし。
暇なときにでもbrowseVignettesを使って,変化がないか見てみましょう。
citation
citation関数は,R本体やパッケージを引用したいときに,そのひな形を出力してくれます。
> citation() To cite R in publications use: R Development Core Team (2011). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, URL http://www.R-project.org/. A BibTeX entry for LaTeX users is @Manual{, title = {R: A Language and Environment for Statistical Computing}, author = {{R Development Core Team}}, organization = {R Foundation for Statistical Computing}, address = {Vienna, Austria}, year = {2011}, note = {{ISBN} 3-900051-07-0}, url = {http://www.R-project.org/}, } We have invested a lot of time and effort in creating R, please cite it when using it for data analysis. See also ‘citation("pkgname")’ for citing R packages.
bibtex形式のものも出力してくれるのが親切ですね。
引数にパッケージ名を与えれば,パッケージの引用フォーマットを出力してくれます。
> citation("survival") To cite package ‘survival’ in publications use: Terry Therneau and original Splus->R port by Thomas Lumley (2011). survival: Survival analysis, including penalised likelihood.. R package version 2.36-10. http://CRAN.R-project.org/package=survival A BibTeX entry for LaTeX users is @Manual{, title = {survival: Survival analysis, including penalised likelihood.}, author = {Terry Therneau and original Splus->R port by Thomas Lumley}, year = {2011}, note = {R package version 2.36-10}, url = {http://CRAN.R-project.org/package=survival}, } ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and may need manual editing, see ‘help("citation")’ .
これらの情報は基本的にはパッケージのdescriptionからの自動生成なのですが,パッケージにCITATIONファイルが用意されている場合,そちらが表示されます(オプションでどちらを表示するか指定もできます)。
> citation("VGAM") To cite VGAM in publications please use: Thomas W. Yee and C. J. Wild (1996). Vector Generalized Additive Models. Journal of Royal Statistical Society, Series B, 58(3), 481-493. and/or Thomas W. Yee (2010). The VGAM Package for Categorical Data Analysis. Journal of Statistical Software, 32(10), 1-34. URL http://www.jstatsoft.org/v32/i10/. and/or Thomas W. Yee (2011). VGAM: Vector Generalized Linear and Additive Models. R package version 0.8-4. URL http://CRAN.R-project.org/package=VGAM
CITATIONファイルが用意されている場合,そこに記載されている論文や書籍は確実にパッケージの重要な情報源ですので,要チェックです。
create.post
create.post関数は,メールを作成します。
送信してくれるわけではなく,実行するとメーラーが起動します。
create.post(instructions="メール本文", subject="Rでメール", address="test@example.com", info="重要!")
ほとんど説明の必要がないですが,infoに指定した文字列は,"--please do not edit the information below--"という文のあとに書き込まれます。
使い途あるようなないような関数ですね(笑)
formatUL, formatOL
ベクトルを箇条書き形式に整形してくれます。ULは順序なしの箇条書き(Unordered List),OLは順序ありの箇条書き(Ordered List)です。
> cat(formatUL(1:10), sep="\n") * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 > cat(formatUL(1:10, label="†"), sep="\n") † 1 † 2 † 3 † 4 † 5 † 6 † 7 † 8 † 9 † 10
文字列ベクトルで返ってくるので,catで出力しています。ラベルオプションで頭の記号を変えられます。formatOLも使い方は同じです。
cat(formatOL(1:10), sep="\n") cat(formatOL(1:10, type="a"), sep="\n") # アルファベット cat(formatOL(1:10, type="A"), sep="\n") cat(formatOL(1:10, type="i"), sep="\n") # ローマ数字 cat(formatOL(1:10, type="I"), sep="\n")
使いどころを選びますが,知ってると便利な場面もあるかもしれないですね。
recover
これは直接実行する関数ではなく,オプションに設定します。
options(error = recover)
このように設定すると,エラーが起きたときに,エラーが起きた環境に遡って変数などを見ることができます。
デバッグのためにbrowser()を仕込むのは常套手段ですが,エラーが起きた箇所に自動的に遡ってbrowser()を仕込んでくれる感じです。超便利ですね。
終わり
以上,小ネタ集でした!
memiscパッケージのrecodeのバグ
追記(2011/11/07):memisc(0.95-35)で修正されました。
memisc(0.95-33)のrecode関数にはバグがある模様。
> library(memisc) > x <- 1:100 > y <- recode(x, "low" <- range(min, 30), "hi" <- range(31, max)) > x[1:10*3] <- NA > z <- recode(x, "low" <- range(min, 30), "hi" <- range(31, max)) 以下にエラー if (any(nevtrue)) { : TRUE/FALSE が必要なところが欠損値です
NAが含まれる数値ベクトルを渡すとエラーが出る。
以下のように,NAに一時的に数値を割り当てて対処するのがたぶん一番楽。
> x[is.na(x)] <- 999 > z <- recode(x, "low" <- range(min, 30), "hi" <- range(31, 100), + otherwise=NA) > z [1] low low <NA> low low <NA> low low <NA> low low <NA> low low [15] <NA> low low <NA> low low <NA> low low <NA> low low <NA> low [29] low <NA> hi hi hi hi hi hi hi hi hi hi hi hi [43] hi hi hi hi hi hi hi hi hi hi hi hi hi hi [57] hi hi hi hi hi hi hi hi hi hi hi hi hi hi [71] hi hi hi hi hi hi hi hi hi hi hi hi hi hi [85] hi hi hi hi hi hi hi hi hi hi hi hi hi hi [99] hi hi Levels: low hi
バク報告したいけど英語メールがめんどくさい…。
でも,memisc推進の妨げになるので近いうちにします。
コマンドのみペースト
Windows限定?
> x <- 1 + 2 > x [1] 3 > y <- x * 10 > y [1] 30 > x + + y + + 10 [1] 43
こんなふうに,ブログとかPDFとかに実行結果が貼り付けてあって,元のスクリプトがない場合がありますよね。
いままではエディタに貼り付けてからちまちまと頭の記号とか出力とかを消してたんですが。
コンソールを右クリックすると,「コマンドのみペースト」というのがあります。
存在は知っていたんですが,使い方がよくわかっていませんでした。
そう,つまり,これは「出力のコピーからコマンドのみをペースト」する機能でした。
スクリプトが必要ならば,いったんペーストしてからhistory()を実行すればいいわけです。
いままで気付かなかったことにショックを受けたのですが,みなさんは知ってましたか?
Rookパッケージがすごい!Rだけで1分で0からウェブアプリ
要R (≥ 2.13.0)です。では,おもむろに以下のスクリプトを実行してください。
install.packages("Rook") s <- Rhttpd$new() s$start(quiet=TRUE) s$browse(1)
ブラウザが立ち上がり,テスト用のウェブアプリが表示されました。たったこれだけで!
なぜこんなことができるかというと,Rは実はウェブサーバーを内蔵していて,Rookパッケージはこれを使ってウェブアプリを稼働させています。
Hello, World!
ではお約束にとりかかりましょう。
app.hw <- function(env){ res <- Rook::Response$new() res$write("<html>\n<head><title>Test</title></head>\n<body>\n") res$write("<h1>Hello, World!</h1>\n") res$write("</body>\n</html>\n") res$finish() } s$add(app=app.hw, name="HelloWorld") s$browse("HelloWorld")
これだけです!ほとんど説明は要らないぐらい簡単ですが,まず,最初のスクリプトで生成したsというオブジェクトは,Rhttpdオブジェクトで,ウェブアプリとサーバーの橋渡しをします。Rhttpdオブジェクトに関数の形で作ったウェブアプリを渡します。RhttpdオブジェクトはR5クラスなので,addというメソッドを使ってs$add(app=ウェブアプリの関数, name=ウェブアプリの名前)という形でウェブアプリを登録します。browseメソッドは単なるユーティリティ関数で,ウェブアプリ名かウェブアプリのインデックスを与えるとブラウザを起動してそのウェブアプリを表示してくれます。
ウェブアプリとなる関数の中身ですが,これも単純ですね。まず,今回は使っていませんが,引数はenvだけです。次に,Rookパッケージの名前空間にあるResponseオブジェクトにアクセスしています。ResponseオブジェクトはResponseクラスのgenerator objectで,newメソッドを使ってResponseオブジェクトを生成しています。このあたりはR5クラスの話になるので,無視してもらってもかまいません。あとは,Responseオブジェクト(res)にwriteメソッドでhtmlを与えてやるだけです。最後にfinishメソッドで終了します。
Rhttpdオブジェクトに登録されているウェブアプリは,printメソッドで一覧できます。
> s$print() Server started on 127.0.0.1:21483 [1] RookTest http://127.0.0.1:21483/custom/RookTest [2] HelloWorld http://127.0.0.1:21483/custom/HelloWorld Call browse() with an index number or name to run an application.
browseメソッドに渡すアプリ名やインデックスはここで確認できます。表示されるURLに直接アクセスしてもかまいません。
Rookの本質
超簡単ウェブアプリサーバーというのは実は仮の姿で,RookはRubyのRackのRでの実装というのが本質です。Rackがどのようなものかはこの記事が分かりやすいですが,要するにサーバーとアプリの橋渡しをするミドルウェアで,Rackに対応したアプリを作れば,Rackに対応したサーバーすべてに対応したことになる,というものです。とはいえRが使えるサーバーは現状Apache(rapache)しかないうえに,rapacheはまだRookに対応していないので,現状では実質的に超簡単ウェブアプリサーバーでしかないのですが。ちなみにRookの作者はrapache,brewの作者と同一なので,rapacheのRook対応は近いうちに実装されると思います。
もう少しウェブアプリっぽいもの
次はリクエストを受け取って処理をするアプリを作ります。といってもRook付属のサンプルなのですが。サンプルはライブラリのRookフォルダの中のexampleAppsフォルダに入っています。
app.hw2 <- function(env){ req <- Rook::Request$new(env) res <- Rook::Response$new() friend <- 'World' if (!is.null(req$GET()[['friend']])) friend <- req$GET()[['friend']] res$write(paste('<h1>Hello',friend,'</h1>\n')) res$write('What is your name?\n') res$write('<form method="GET">\n') res$write('<input type="text" name="friend">\n') res$write('<input type="submit" name="Submit">\n</form>\n<br>') res$finish() } s$add(app=app.hw2, name="HelloWorld2") s$browse("HelloWorld2")
今度はenvを使っています。Rook::Request$new(env)でRequestオブジェクトを生成しています。RequestオブジェクトからはPOSTメソッドやGETメソッドでリクエストの内容を取り出せます。他にも多くの情報が取り出せます。詳細はhelp(Request)にあります。アプリの中身はこれまた単純で,GETの中身がNULLならば何もせず,NULLでなければfriendをGETの中身で上書きする,というものです*1。
ところで,formが出てきたのでXSS脆弱性に気をつけましょう。RookにはUtilsクラスがあり,便利なクラスメソッドが用意されています。そのなかにescapse_htmlというのがあります*2。
> Utils$escape_html("<>'\"&") [1] "<>'"&"
もう少しRっぽいもの
今度はファイルを直接読み込んで登録します。読み込むファイルの仕様の記述は見つけられなかったのですが,ファイル内のappという名前の関数を読み込むようです。
s$add(app=system.file("exampleApps", "summary.R", package="Rook"), name="Summary") s$browse("Summary")
CSVファイルを読み込んでsummary()に通した結果を出力するアプリです。
brew編
brewパッケージはいわゆるテンプレートエンジンで,htmlの中にRのスクリプトを埋め込んだりするためのものです。詳しくはitoshiさんの連載で。参考にさせていただきました,ありがとうございます。
brewはRookといっしょにインストールされているはずです。
こちらの記事にならってヒストグラムを表示するアプリを作ってみます。では,次のコードをindex.rという名前で保存してください。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>Histogram</title> </head> <body> <% brew('./hist.r') %> </body> </html>
さらに,次のコードをhist.rという名前で保存してください。
<% image_dir <- file.path(tempdir(), "plots") if(!file.exists(image_dir)) dir.create(image_dir) filepath <- tempfile("hist_", tmpdir=image_dir, fileext=".png") filename <- basename(filepath) data <- rnorm(1000) png(filepath) hist(data) dev.off() %> <img src="./plots/<%=filename%>" />
まず,index.rはほぼhist.rの中身を読み込むだけのものです。hist.rは正規分布にしたがうデータからヒストグラムを作成し,imgタグを返しています。Rのスクリプトは<% 〜 %>の中か<%= 〜 %>の中に書きます。<%= 〜 %>の場合はスクリプトの出力がhtml内に埋め込まれます。
簡単なスクリプトですが,一カ所だけ変なところがあります。いま,filepathの中身はtempdir()を使っているので"C:\\Users\\masahiro\\AppData\\Local\\Temp\\RtmpUzjlma/plots\\hist_9654f.png"のようになっています。にもかかわらず,imgのsrcは"./plots/<%=filename%>"です。これはhtmlに出力されるさいには"./plots/hist_9654f.png"のようになります。このあたりのカラクリは次のスクリプトで。
brew.app <- Builder$new(Static$new(urls="/plots",root=tempdir()), Brewery$new(url="/",root="(index.rとhist.rが置いてあるフォルダのパス)"), Redirect$new("/index.r")) s$add(name="brewApp", app=brew.app) s$browse("brewApp")
brewで書いたアプリを登録するためのスクリプトです。Brewery$new()の中のrootだけ書き換えてください。Builder,Brewery,Redirectはgenerator objectで(以下略。Builderオブジェクトはウェブアプリ本体で,直接関数をRhttpdに突っ込むより柔軟に設定ができます。まずStaticオブジェクトで静的なコンテンツの場所を設定します。rootは静的なコンテンツの置かれている実際のフォルダを指定します。urlsはrootの中からウェブアプリ内で用いるフォルダを文字列ベクトルで指定します。少しややこしいですが,例えばstaticというフォルダ内にcss,javascript,imagesというフォルダを作っている場合,rootにstaticを指定して,urlsにc("/css", "/javascript", "/images")を指定します。この設定により,前述の"/plots/hist_9654f.png"へのアクセスは"C:\\Users\\masahiro\\AppData\\Local\\Temp\\RtmpUzjlma/plots\\hist_9654f.png"に読み替えられることになります。
次にBreweryオブジェクトでbrewファイルを読み込みます。root内のファイルがbrewファイルとして認識されます。urlにはStaticと同じくウェブアプリに読み込むファイルを指定します。"/"としておけばroot内のファイルが全てbrewファイルとして認識されます。正規表現を使うこともできるようです。
Redirectオブジェクトでは,ウェブアプリのURL(例えばhttp://127.0.0.1:21483/custom/brew/)にアクセスしたときに転送するURLを指定します。
ウェブアプリの公開
一般公開する場合,R内蔵のウェブサーバーがどの程度のものか分からないので,rapacheとの連携を待ったほうがよいような気がします。ただ,内部向けに公開したい場合もあるでしょう。その場合は,RhttpdオブジェクトのstartメソッドでIPアドレスとポートを設定できます。
s$start(listen="192.168.11.15", port="8080")
読むべき資料
ヘルプがけっこう充実しています。
- help(Rhttpd)
- help(Response)
- help(Request)
- help(Builder)
- help(Brewery)
- help(URLMap)
作者のブログ。この人,パッケージ作りまくってますね…すごい…。http://goo.gl/AJKV2
わからなかったこと
Rをサービスとして待機させておくことってできないんでしょうか? R --file=script.Rとかやっても,scriptを実行したら終了してしまう…。コンソール開きっぱなしにしておくのもスマートじゃないですし…。やっぱりrapache待ちでしょうか。でもrapacheを使うとなるとRookのお手軽さがなくなってしまうのが残念。
sessionInfo
> sessionInfo() R version 2.13.0 (2011-04-13) Platform: i386-pc-mingw32/i386 (32-bit) locale: [1] LC_COLLATE=Japanese_Japan.932 LC_CTYPE=Japanese_Japan.932 LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C [5] LC_TIME=Japanese_Japan.932 attached base packages: [1] tools stats graphics grDevices utils datasets methods base other attached packages: [1] Rook_1.0-2 brew_1.0-6
memiscGUIパッケージあらためRzパッケージをCRANに登録しました
これは古い情報です。最新の情報はこちらになります(2012/02/03)
長らく更新が止まっていたmemiscGUIパッケージですが,Rzパッケージと名前を変え,CRANに登録しました。パッケージの目的や使い方には大きな変化は無いですが,更新点は多数あります。
- R5リファレンスクラスで全面的に書き直しました。
- データセットとデータフレームのリンクが不要に。大局的環境のデータフレームとシームレスに同期。
- 一度読み込んだデータセットはキャッシュしておくことで,データセットの切替を高速化(ほぼ待ち時間なし)。
- 独自形式データ(*.rzd)の保存・読み込み機能(実態は独自クラスオブジェクトをsave()で保存しているだけ)。
- 変数名,変数ラベルの検索機能を実装。
- リコード時に変数ラベルの付与が可能に。
- その他,たくさんのバグフィックス。
自分でいうのもなんですが,memiscGUIと比べると,格段に使いやすくなり,実用的になっていると思います。
インストール
Rのバージョンは2.12以上に上げる必要があります。バージョンが古い場合はCRANミラーからダウンロードしてインストールしてください。
次に,メニューバーからRzパッケージをインストールするか,install.packages("Rz")を実行してください(現時点ではまだtsukubaミラーには同期されていないので,hyogoミラーからインストールしてください)。他の依存するパッケージがインストールされていない場合は,同時にインストールされます。
これまでにRGtk2パッケージをインストールしていない場合
Rzパッケージが依存しているRGtk2パッケージを使うためには,R外部のソフトウェアとしてGtk+2 Runtimeをインストールする必要があります。Runtimeをインストールしていない場合は,まずlibrary(RGtk2)を実行してください。エラーが出ますが,そのあとにRuntimeをインストールするかどうかを尋ねるダイアログが表示されるので,インストールを選ぶと自動的にダウンロードされ,インストールのプロセスが始まります。特に設定を変えずにそのままインストールすれば大丈夫です。Runtimeのインストール後,Rを再起動し,library(RGtk2)を実行してエラーが出なければ完了です。まだエラーが出る場合は,パソコンを再起動してみてください。
すでにRGtk2パッケージをインストールしている場合
RGtk2のバージョンは2.20以上が必要です。RGtk2パッケージのアップデートはメニューバーからパッケージの更新を実行するか,update.packages()を実行してください。
また,Windowsでは,RGtk2パッケージのアップデートにともない,Gtk2 Runtimeも新しくインストールする必要があります。古いRGtk2が対応していたRuntimeは更新が止まってしまったため,コントロールパネルから必ずアンインストールしてください。アンインストール後,上記の手順で新しいRuntimeをインストールしてください。
起動
library(Rz)で読み込み,Rz()を実行するだけです。Windowsの場合は,メニューバーからも起動できます。詳しい使い方はそのうちマニュアルを書こうと思います。
名前の由来
名前については…特に意味はありません。Rの文字で始めたかったというのと,CRANを調べたところ,2文字目がzのパッケージがひとつも無かったので。