実装関連事項

各種プログラミング言語の基本的な書き方やソフトウェア等の使用方法について.

Linuxマシンへのインストール

管理者権限なし,画面なしで R を $HOME/local インストールする.最初に,公式ページの Source Code for all Platforms の最新版の R ソースコード R-x.x.x.tar.gz を良いのでダウンロードする.次に,以下のコマンドで解凍する.以下の一連のコマンドでインストールする.$HOME/local にインストールしたいので --prefix=$HOME/local と,画面なしの計算機にインストールする場合は --with-x=no のオプションを加える.

$ tar zxvf R-2.15.3.tar.gz
$ cd R-2.15.3
$ ./configure --prefix=$HOME/local --with-x=no
$ make
$ make install

Windows版Rguiの初期設定

R は起動時にコンソールや描画グラフのフォント等を設定するファイルを読み込む.設定ファイルは,Windows 版の R の場合,インストールディレクトリの bin と同じ階層にある etc ディレクトリに,Linux の場合は,インストールディレクトリを任意のディレクトリに指定してインストールした場合はそのディレクトリ下の etc ディレクトリに,ルート権限ありでデフォルトの設定でインストールした場合は /etc/R ディレクトリに保存されている.

設定ファイルは,Rconsole および Rdevga のふたつがある.Rconsole は,RGui のコンソールの背景色やフォントサイズ,フォントの色などを詳細に設定できる.Rdevga は,描画グラフのフォント等の設定に用いるものである.RGui を好みの設定にしこれらのファイルを上書きすると,次回起動時からもその設定で R が起動される.RGui のコンソールの背景色を黒にするには以下のようにする.

RGui を管理者として起動させ,"編集" → "GUIプリファレンス" と進む.その画面で,背景色の選択を行う.文字色やフォント等も設定したら,"Save..." をクリックし R のインストールフォルダの etc 直下にファイル名を Rconsole として保存する.

ipr_r_basic_usage_01.jpg

次回起動時には以下のような画面が開く.

ipr_r_basic_usage_02.jpg

パッケージの追加

インストールしたいパッケージのパッケージ名があらかじめわかっている場合,以下のコマンドで直接インストールすることができる.

$ install.packages("MASS")

パッケージをインストールしたいディレクトリは以下のようにオプション lib で指定する.

$ install.packages("MASS", lib="/data/Rpackages/")

パッケージをダウンロードしたいサーバーを指定するには以下のように repos オプションを指定する.

$ install.packages("MASS", repos="http://cran.ism.ac.jp/")

Rgui を使用している場合は GUI インターフェイスにて対話形式でインストールできる.まず,メニューから "パッケージ" → "パッケージのインストール" と進む.ここでパッケージをダウンロードするサーバーを選ぶが,選択するサーバーはどこでも良い.

ipr_r_basic_usage_03.jpg

上でサーバーを選択すると引き続き Packages というダイアログが開くので,そこから目的のパッケージを選択して,OK ボタンを押す.

ipr_r_basic_usage_04.jpg

追加したパッケージを読み込みたいときは R コンソールにて以下のコマンドを打ち込めば良い.

$ library(MASS)

インストール済みのパッケージの一覧は以下のコマンドで確認できる.

$ library()

読み込み済みのパッケージの一覧は以下のコマンドで確認できる.

$ search()

不要なパッケージの削除は以下のコマンドで行う.

$ remove.packages("MASS")

CRANのミラーサイトは以下のコマンドでも指定することができる.

$ options(repos="http://cran.ism.ac.jp/")

Rscript からパッケージをインストールするには以下のように打つ.

$ Rscript -e 'install.packages("MASS", repos="http://cran.ism.ac.jp/")'

コマンドラインからの実行

R はプログラミング言語としても環境としても使えるツールである.に付属の Rscript を利用するとその他のプログラミング言語と同じようにコマンドラインからプログラムを実行することができる.Rscript は最も簡単にはコマンドラインにて "Rscript プログラム.R 引数1 引数2 引数3 ..." のように使用する.コマンドラインを用いて標準出力に Hello と表示させるためには,最初に以下のようなファイル (hello.R) を作成する.

#!/usr/bin/env Rscript

main=function()
{
	print("Hello")
}

main()

次に,このスクリプトを実行するには以下のようにする.オプション --vanilla はスクリプト起動にあたり,余計なオブジェクト等を読み込まないためのオプションであり,--slave はスクリプト実行時に標準出力に表示される情報を最小限に抑えるためのものである.無理に付けなくても良い.

$ Rscript --vanilla --slave hello.R

結果は以下のようになる.

$ Hello

Rscript は -e オプションと共に用いるとワンライナーで使用することができる.以下のように用いる.

$ Rscript -e "print(100)"

結果は以下のようになる.数値100が出力される.

100

ディレクトリ情報の表示

カレントディレクトリの確認は Bash 等で用いられる pwd ではなくて getwd() で行う.

$ getwd()

ディレクトリの移動には cd ではなくて以下のコマンド setwd() を用いる.ひとつ上の階層に移動したいときは以下のようにする.

$ setwd("../")

ディレクトリを作成するには dir.create を用いる..

$ dir.create("foo")

カレントディレクトリのディレクトリ foo 以下に含まれる bar の存在確認を行い,存在しない場合には作成するには以下のように書く.

#!/usr/bin/env Rscript

main=function()
{
	if(!file.exists("foo/bar"))
	{
	    dir.create("foo/bar")
	}
}

main()

変数の表示

これまでに記録した変数・オブジェクトの表示は以下のコマンドで確認できる.Bash の ls とは異なり,() が必要.

$ ls()

逆に,これまでに記録した変数・オブジェクトの表示を消去するためにはコマンド rm を用いる.作成したオブジェクト data を消去するためには以下のようにする.

$ rm(data)

作成した変数のデータ形式,すなわちオブジェクトの属性はコマンド class を用いることで確認できる.オブジェクトがデータフレームの場合は data.frame,マトリックスの場合は matrix,数値の場合は numeric というような結果を表示する.

$ class(data)

ファイルへの出力

オブジェクトやコマンドの実行結果をまとめてファイルに書き出すには以下のようなスクリプトを用いる.1行目のコマンド file にてアウトプットファイル名を指定する.引数 open にはファイルのオープンモードを指定する.書き込みの場合は w を指定する.コマンド cat では引数 file 以前の引数にて指定したオブジェクト等を連結して file で指定したファイルに出力する.

#!/usr/bin/env Rscript

main=function()
{
	NEWFILE=file("bar.txt",open="w")
	
	for(i in c(1,2,3,4,5))
	{
		for(j in c("a","b","c"))
		{
			cat(i,"\t",j,"\n",file=NEWFILE)
		}
	}
}

main()

以上のスクリプトを実行して出力される bar.txt の内容は以下のようになる.

1 	 a 
1 	 b 
1 	 c 
2 	 a 
2 	 b 
2 	 c 
3 	 a 
3 	 b 
3 	 c 
4 	 a 
4 	 b 
4 	 c 
5 	 a 
5 	 b 
5 	 c 

ファイル名情報の取得

指定したディレクトリ foo から,指定した拡張子 .txt を持つファイルのリストを得るには以下のように打つ.

$ list.files("foo",pattern=".txt$")

さらに,そのファイルリスト中のファイル名から拡張子 .txt を除いたファイル名のリストを得るには以下のように打つ.

$ gsub(".txt$","",list.files("foo",pattern=".txt$"))

ファイル・ディレクトリの存在確認

ファイルおよびディレクトリの存在確認をするには file.exists() を利用する.カレントディレクトリにて,ディレクトリ foo の存在確認をして,存在しない場合 foo を作成するには以下のように書く.

#!/usr/bin/env Rscript

main=function()
{
	if(!file.exists("foo"))
	{
		dir.create("foo")
	}
}

main()

ファイルサイズの確認

ファイルの容量が0かどうかを確認するには file.info() を利用する.

#!/usr/bin/env Rscript

main=function()
{
	if(!file.info("foo")$size!=0)
	{
		dat=data.frame(read.table("foo"))
	}
}

Rscriptでの引数の取得

Rscript で引数を取得したい場合は argv=commandArgs(T) を書く.以下のようにすると,argv[1] に1番目の引数が格納される.

#!/usr/bin/env Rscript

main=function()
{
	argv=commandArgs(T)
}

外部プログラムの実行

R から外部のプログラムを呼び出し,実行するにはコマンド system を利用する.シェルの ls コマンドを R から呼び出してカレントディレクトリの内容を表示させたい場合は以下のように書く.

#!/usr/bin/env Rscript

main=function()
{
	system("ls")
}

main()

外部プログラムを実行した結果をRの変数に格納したい場合はオプション intern を用いる.

#!/usr/bin/env Rscript

main=function()
{
	liresult=system(paste("ls",dir,"|grep .txt$",sep=" "), intern=T)
	print(liresult)
}

main()

オプション input に文字列ベクトルを指定すると,1行につきそのベクトルの要素をひとつ含んだ一時ファイルを生成し,それを外部プログラムの入力ファイルとすることができる.

#!/usr/bin/env Rscript

main=function()
{
	system("cat", input=c("aaa", "bbb", "ccc"))
}

main()

これを実行した結果は以下のようになる.コマンド cat によってオプション input で指定した文字列が格納された一時ファイルの中身が表示された.

aaa
bbb
ccc

オプションには以下のようなものがある.

プログラム詳細使用例
command呼び出したい外部プログラム・コマンドを文字列で指定.command="ls"
internT または F で指定.コマンド system の実行結果を R 内部の変数として格納した場合,T を指定.intern=T
ignore.stdoutT または F で指定.F のとき,外部プログラムの実行結果を標準出力させない.ignore.stdout=T
ignore.stderrT または F で指定.F のとき,外部プログラムの実行によって生じる標準エラーを表示させない.ignore.stderr=T
waitT または F で指定.R インタプリタが外部プログラムが実行終了することを待つかどうかの指定.wait=F
input文字列ベクトルを指定.文字列ベクトルの要素を1行につきひとつずつ記載した一時ファイルを生成し,それを command で指定した外部プログラムの入力とする.input=c("foo", "bar")

データフレームの作成

Rにおける新規データフレームの作成はコマンド data.frame() を用いる.データフレーム名 newdata という5行3列からなる新たなデータフレームを作成したい場合は以下のように打つ.

$ newdata=data.frame(A=c(82,73,64,55,46), B=c(101,102,103,104,105), C=c(45,56,67,78,89))

この場合,以下のようなデータフレームが出来る.

   A   B  C
1 82 101 45
2 73 102 56
3 64 103 67
4 55 104 78
5 46 105 89

データフレームの行数は以下のコマンドにて数える.

$ nrow(newdata)

列数は以下のコマンドにて数える.

$ ncol(newdata)

項目数 (列数) と要素数 (行数) は以下のコマンドでも数えることができる.

$ dim(newdata)

以下のコマンド summary にてデータの要約ができる.

$ summary(newdata)

項目 C の昇順にデータを並べ替えたいときは以下のようにする.

$ newdata[order(newdata$C),]

以下のようになる.

   A   B  C
1 82 101 45
2 73 102 56
3 64 103 67
4 55 104 78
5 46 105 89

新たな項目 D を追加したいときは以下のようにする.

$ data.frame(newdata,D=c(11,23,34,45,31))

以下のようになる.

   A   B  C  D
1 82 101 45 11
2 73 102 56 23
3 64 103 67 34
4 55 104 78 45
5 46 105 89 31

新たな行を追加したいときは以下のようにする.

$ rbind(newdata,c(9,9,8))

以下のようになる.

   A   B  C
1 82 101 45
2 73 102 56
3 64 103 67
4 55 104 78
5 46 105 89
6  9   9  8

行に名前を付けたいときは以下のようにする.

$ rownames(newdata)=c("aa","bb","dd","ee","ff")

以下のようになる.

    A   B  C
aa 82 101 45
bb 73 102 56
dd 64 103 67
ee 55 104 78
ff 46 105 89

空の4列からなるデータフレーム DAT を生成したい場合は以下のようにする.

$ DAT=data.frame(matrix(rep(NA,4),nrow=1))[-1,]

変数によるデータへのアクセス

他のプログラミング言語のように変数名を変えながらデータにアクセスする.最初に,以下のコマンドでデータフレーム dat を作成する.

$ dat=data.frame(A1=c(82,73,64,55,46), A2=c(101,102,103,104,105), A3=c(45,56,67,78,89))

このデータフレーム dat の項目 A1 には以下のようにすることでアクセスできる.

$ print(dat$A1)

以上のコマンドの結果は以下のようになる.

82 73 64 55 46

以上のようにひとつずつアクセスすることはできるが,大量のデータを扱う場合はプログラムを書いたほうが正確かつ高速に処理できる.このデータフレームの項目 A1 から A3 まで順にアクセスしたい場合は以下のようなスクリプトを書く.'[[]]'がオブジェクトの各項目にアクセスするための文法となる.

#!/usr/bin/env Rscript

main=function()
{
	array=c("A1", "A2", "A3")
	
	for(i in array)
	{
		print(dat[[i]])
	}
}

main()

以上のスクリプトを適当な名前 (foo.R) で保存して以下のように実行した結果は以下のようになる.変数によって順次データフレームの項目にアクセスできる.

82 73 64 55 46
101 102 103 104 105
45 56 67 78 89

これとは別に以下のように書いても同様の結果が得られる.

#!/usr/bin/env Rscript

main=function()
{
	for(i in 1:3)
	{
		print(dat[[paste("A",i,sep="")]])
	}
}

main()

これを実行した結果は以下のようになる.上と同様に変数名を変えながら順次データフレームの項目にアクセスできる.

82 73 64 55 46
101 102 103 104 105
45 56 67 78 89

行列の累乗

正方行列のべき乗 (冪乗) は以下のように求める.最初に,サンプルとして用いる正方行列 A を以下のコマンドで作成する.

$ A=array(c(3,1,1,1,4,2,1,1,1,1,2,1,4,1,1,2), dim=c(4,4))

生成された行列は以下.

3 4 1 4
1 2 1 1
1 1 2 1
1 1 1 2

この行列Aを3分の1乗する.以下のコマンドにて行う.A_dec が求める行列Aの3分の1乗根.

$ eigen=eigen(A)
$ A_dec=eigen$vectors %*% diag((eigen$values)**(1/3)) %*% solve(eigen$vectors)

以上の操作で行列の累乗 (冪乗) が計算できるが,この操作は行列の固有値が全て正の場合に限り成功する.行列Aの固有値は以下のコマンドで確認できる.

$ eigen(A)$values

数値や文字列の長さの取得

数値の桁数を知るには以下のように打つ.以下の場合,4 が得られる.

nchar(1000)

関数 nchar() は本来文字列の長さを計算するための関数であるため,負の値で - を含む場合や小数点を含む場合はそれを考慮する必要がある.以下の場合,6 が得られる.

nchar(-100.1)

一方で以下の場合は 4 が得られる.これは小数点以下 .0 を省いた -100 の文字列カウントの結果としての 4 に由来する.使い方が難しい.

nchar(-100.0)

文字列に変換すれば,当然目的の値が得られる.

nchar("-100.0")
Hatena Google+