なるほど機能
「こんな機能があればいいな」と思うことが時々ありますが、多くの場合実際にあるのが R の魅力です。コツは help.search("hoge") でキーワード検索することですが、適切なキーワード hoge を思いつくのが意外に困難です。 以下に Q&A 等で発見されたそうした機能をメモしておくことにします。ポインターだけ紹介しますので、詳しくは該当関数のオンラインヘルプで使い方を確かめてください。この Wiki に関連記事があることも多いはずなので、RjpWiki 各頁の末尾にある RjpWiki 内専用の検索機能も試してください。
- R 関連のドキュメントからの全文検索 困った時は <<R site search:>> でキーワード検索
- オブジェクトに注釈用のコメントを加える comment() 関数
- 一画面に収まらない長いオブジェクトを pager で自在に閲覧する page() 関数
- (複雑な)オブジェクトを後から再現できるようにテキスト形式でファイルにセーブ dump() 関数
- 関数オンラインヘルプを dvi (ps) 形式で得る help() 関数の offline オプション
- example 関数等で複数のグラフィックスが瞬時に消え去るのを防ぐ par(ask=TRUE)
次のグラフィックス表示前に確認を求めるのでゆっくり眺められる
- 使えそうな関数を見つける help.search("keyword")
ただし適切なキーワードを思いつくにはそれなりの経験が必要なことが多い。検索は現在インストールされているすべてのパッケージを対象として行なわれるので、とりあえず不要なパッケージもまめにインストールしておくのが良い。標準パッケージにある関数も、他のパッケージに改良版があることも多い。
- シミュレーション等で同じ操作を何度も繰り返す際、ある試行でエラーが起きても残りを実行する try 関数
- 関数から複数の(一般にタイプの異なる)値を返す リスト返り値 return(list(..., ..., ...)), return(list(x=..., y=..., ...))
- 変数への付値とその値の表示を一度に行なう 付値式を丸括弧で囲む (x <- 1:10)
- オブジェクトの内容を簡潔に整形して表示 str() 関数
- データフレームの成分を一時的に展開した環境中で操作 with()
具体的には attach(データフレーム); 成分名を使った操作; detach(データフレーム) という前後処理が不要になる
- 複数回の同一操作の結果を一括してリスト、ベクトルとして返す apply 関数群 lapply, mapply 等
- 関数を返す関数 関数Tips を参照。同一関数のパラメータをさまざまに変えて使いたい時便利
- 二者択一選択 ifelse() 関数
条件式の真偽に応じて異なる値を返すことができ、if (..) ... else ... 構文を簡略化できる
- サマリー機能 summary()
多くの R の統計処理関数の結果は summary() 関数で結果の簡潔かつ本質的な要約を得ることが出来る。「もしや」と一度試してみる価値がある。
- プロット機能 plot()
多くの R の統計処理関数の結果は plot() 関数でグラフィックス表示を得ることが出来る。「もしや」と一度試してみる価値がある。
- 文字列と(数値)変数を結合して文字列を得る paste()
関数は文字列と、数値オブジェクトを文字列化したものを結合し、一つの文字列にする。オプションで間に挟む文字も指定できる
- プログラムの実行時間を計る system.time()
- プログラムの実行を指定秒数中断 Sys.sleep()
- プログラムの実行中にコンソールから行入力 readline()
プログラムの実行を一時中断するのにも使える。
- メニュー方式で選択分岐 menu()関数
- プログラムのデバッグ browser(), debug()
- プログラムの実行速度のボトルネックの発見 Rprof()
- 関数オプションの入力省略
各関数のオプション option=value は一意的に決まる範囲で省略できる。例えば optim(..., method = "BFGS", ...) は optim(..., m = "BFGS", ...) でOK。
- 論理値 TRUE, FALSE の省略記法
論理値 TRUE, FALSE は構文上混同が起きない限りそれぞれ T, F と省略できる。またこれらは数値が要求される場合はそれぞれ 1, 0 と解釈される。
- ベクトル、行列、配列の特定の成分の添字を得る which(x==3) (x をベクトルとみなしベクトルとしての添字を返す), which(x==3, array.ind=TRUE) (x が行列、配列ならば行列、配列としての多次元添字を返す)。
- 安全な完全一致判断 identical()
二つの R オブジェクトが完全に一致するかどうかを検査する安全で信頼できる方法。
- すべて該当するか? all()
- ほとんど該当するか? all.equal()
二つの R オブジェクトが「殆んど等しいか」どうかをチェックする。「殆んど等しい」の意味はオブジェクトにより異なる。数値ベクトルでは誤差の範囲内で一致するかどうかを判断する。
- 階乗 n! を計算する gamma(n+1)
引数の +1 を忘れない。その対数値は lgamma(n+1) 。R 1.9 より階乗関数とその対数値に対する専用関数 factorial(n), lfactorial(n) が登場した。
- 二項係数 nCk を計算する choose(n, k) その対数値は lchoose(n,k)
- 数列の部分和・積、そして部分最大・最小値からなる数列を計算 cumsum(), cumprod(), cummax(), cummin()
- ベクトルの最大・小要素の位置を求める which.max(), which.min()
- 行列の各列毎の最大要素の位置を求める max.col()
- ベクトルの要素の一意化 unique()
- ベクトルの要素のソート sort()
オプションで逆順ソートも可能
- ベクトルの要素を逆順に並べ変える rev()
- C の sprintf 風の整形付き出力 sprintf()
- 条件(群)がすべて真でなければストップ stopifnot()
- データフレームの成分を名前だけで引用できるようにする attach(...)
不要になれば detach(...) で消去する。
- データフレームの成分を展開した一時的環境中で作業 with()
一々 attach(...), detach(...) しなくても成分名で操作できる
- ベクトルに対する集合演算 union(x, y), intersect(x, y), setdiff(x, y), setequal(x, y), is.element(el, set), %in%
- 表示される有効桁数を変える。 options(digits=10)
内部演算桁数は変更されず。最大22桁まで指定できるが、意味のある最大桁数はせいぜい 15, 16 桁です。
- 日時、時間を得る date()
- 機械固有定数のリストを得る .Machine
- 組み込み定数 LETTERS, letters
大文字アルファベット、小文字アルファベット、
month.abb 英字月名(3文字省略)、
month.name 英字月名(フル)
- ファイルに書き出す write、save、write.table
- ファイルから読み込む scan、read.table、read.csv、read.csv2、read.delim、read.delim2、read.fwf
- C 風演算子 +=, -=, *=, /= を R で実現
二項演算子定義の例 参照
- 不特定多数の引数を関数に渡す
特殊な引数 ...。各引数はそれぞれ ...[1], ...[2],... と関数内で参照できる。
- オブジェクト名を与えてその値を得る get()
- 一つのケースについて(数値、文字列等が混在した)何組かの項目を行列風に表現し、操作する。 data.frame()
実際データフレームは多くの R/S の統計関数の基本的なデータ表現方法であり、これをマスターすることが上達のコツです。
- 関数の名前つき引数の既定省略値
関数 f に対する名前つき引数には指定省略時の既定値を与えることができる。この既定値の値は R の他の関数 g の返り値であってもよい。さらに関数 g の引数が f の引数を用いて計算されても良い。
例 f(x, foo="bar"), digitsBase(x, base = 2, ndigits = 1 + floor(log(max(x), base)))
- 名前つき引数の名前の一部省略
名前つき引数に値を指定する際、引数名は一意的に決定される限り先頭の数文字を与えるだけで良い
例 digitsBase(x, base = 2, ndigits = 1 + floor(log(max(x), base)))
digitsBase(10, b=16), digitsBase(10, b=8, n=5)
- 複数行の一括コメント化
複数の行を if(0){ 複数の行 } と囲めばコメントとして無視される。
- 繰返し while(論理値を返す表現){ コード }
- 行列の行・列和を加える関数(R 1.9 の新機能)
> x <-matrix(1:4, nc=2)
> addmargins(x)
[,1] [,2] [,3]
[1,] 1 3 4
[2,] 2 4 6
[3,] 3 7 10
- パッケージ中のオブジェクトの一覧 library(help=stats)
"stats" パッケージ中のオブジェクトの一覧
- パッケージ中の組み込みデータオブジェクトの一覧 data(package="stats")
"stats" パッケージ中の組み込みデータオブジェクトの一覧
- 複雑なオブジェクトに含まれる項目数を得る
unlist() 関数
リストや、ベクトル、行列をベクトル化する。R の関数の返り値はしばしば膨大な附属情報を隠れて持つが、どれくらいか見積もるのに使える。
> x = list(rnorm(10), "abc", matrix(1:16,4,4)) # 複雑なオブジェクトのつもり
> length(unlist(x))
[1] 27 # 総計27項目(大雑把に8倍すれば対応メモリ量が見積もれる)
- オブジェクトのベクトル化
c()
時系列、データフレームをベクトル化するのに使える
- メモリーの利用状況の表示
gc, gcinfo
- 総称的関数、クラス用のメソッドの一覧を得る
methods()
> methods(plot) # 総称的関数 plot() に対するメソッドの一覧を得る
[1] plot.HoltWinters* plot.POSIXct plot.POSIXlt
[4] plot.TukeyHSD plot.acf* plot.data.frame
(途中省略)
[28] plot.table plot.ts plot.tskernel*
Non-visible functions are asterisked
> methods(class = "lm") # クラス "lm" のオブジェクト用のメソッド一覧を得る
- 関数中からのオブジェクトのコンソールへの強制出力
print()
関数中からの出力は最後のものを除き原則出力されない。もしどうしても出力したければそれを print() 関数の中にいれる。
test <- function (x) {
print(x) # 引数の値を強制的に出力
return(x^2) # 最後の値は(変数に付値されない限り)出力される
}
> test(2)
[1] 2
[1] 4
- R のさまざまな機能のデモ
demo(), demo(テーマ)
R は様々な機能についてまとめて紹介するためのデモ機能を持つ。現在可能なテーマについては demo() で一覧できる。各テーマについては例えば demo(image) 等で実行する。グラフィックスを段階的に眺めるため、あらかじめ par(ask=TRUE) を実行しておくことを忘れないように。
- 構文を表す文字列を命令として解釈実行
eval(parse(text="...")) は R の適正な構文を表す文字列を命令として解釈実行する定番構文です。
## paste 関数を使って "temp20=-13" という文字列を作っている
> k=-13; j=20; eval(parse(text=paste("temp",j,"=",k,sep="")))
> temp20
[1] -13
## プログラム中で機械的に新しい変数を作るのにも使えます。
> for(i in 1:5) eval(parse(text=paste("temp",i," <- ", runif(1), sep="")))
> c(temp1, temp2, temp3, temp4, temp5)
[1] 0.6150512 0.4978222 0.2924681 0.4796008 0.4626195
- 棒グラフを縦に(横隣に)並べる
barplot() 関数の beside 引数
- 棒グラフの隣り合う棒の間のすき間調整を
barplot() 関数の space 引数。負の値を与えると棒が重なる。
space は長さ 2 のベクトルを値にとることができ、棒グループ内、間のスペーシングを与える
- コンソールへの出力の抑制 (2004.09.18)
invisible() 関数は変数へ付値するのでなければ、結果のコンソールへの出力を抑制する。これは普通、グラフィックス情報等、可読性の低い大量の出力をコンソールに表示しないために、関数の返り値に return(...) の代わりに invisible(...) のように使われる。単独でも次のように余計な出力を抑制するために使うことができる。
> x <- matrix(1:2^3, c(2,2,2))
> apply(x, 2, print)
[1] 1 2 # 以下4行は print 関数の出力
[1] 3 4
[1] 5 6
[1] 7 8
[,1] [,2] [,3] [,4] # 以下は apply 関数の既定の出力
[1,] 1 3 5 7
[2,] 2 4 6 8
> invisible(apply(x, 2, print)) # 必要な出力だけにする
[1] 1 2
[1] 3 4
[1] 5 6
[1] 7 8
# 参考:変数に付値すると apply 関数の既定出力が取り出せる
> y <- invisible(apply(x, 2, print))
[1] 1 2
[1] 3 4
[1] 5 6
[1] 7 8
> y
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
- 先頭、末尾数行の出力 (2004.09.18)
head(x, n=6), tail(x, n=6) はベクトル、行列、データフレーム、関数オブジェクトの先頭、末尾の数行(既定値は6行)を出力する。出力行数は引数 n で変えることができる。
- 長たらしいリスト等を簡潔に表示 (2004.10.25)
> x=list(rep(1,5), matrix(runif(8),4,2), LETTERS[1:6])
> x
[[1]]
[1] 1 1 1 1 1
[[2]]
[,1] [,2]
[1,] 0.48470060224644840 0.83881441224366426
[2,] 0.39877605694346130 0.51671746163628995
[3,] 0.64727503922767937 0.20069422083906829
[4,] 0.92800087924115360 0.14544645673595369
[[3]]
[1] "A" "B" "C" "D" "E" "F"
> noquote(unlist(format(x)))
[1] 1, 1, 1, 1, 1
[2] 0.48470060224644840, 0.39877605694346130, 0.64727503922767937, 0.92800087924115360,
0.83881441224366426, 0.51671746163628995, 0.20069422083906829, 0.14544645673595369
[3] A, B, C, D, E, F
c.f.
> noquote("jkflds")
[1] jkflds
> print("jkljkljkL", quote=F)
[1] jkljkljkL
- 一連の入力コマンド履歴をファイルに保存する。(2004.11.09)
R の終了時に save オプションを指定すると現在の入力履歴はワーキングディレクトリのファイル .Rhistory に保存され、次回起動時に自動的に読み込まれ、矢印キー等で復元できる。コマンド
savehistory("入力コマンド履歴保存ファイル名" は指定したファイルに現在の入力コマンド履歴を保存する。保存した履歴は loadhistory("入力コマンド履歴保存ファイル名") で現在の R セッションに読み込むことができる。重要な操作を恒久的に保存するのにつかうと便利。
- ファイル名に作成時の日付や変数名を付け加える (2004.11.16)
データや画像ファイルを系統的に作成するのに使える
> res <- 12; i <- 5
> paste(substitute(res), ".", gsub(" ", "-", date()),".",i,".png",sep="")
[1] "res.Tue-Nov-16-19:27:01-2004.5.png"
# 画像ファイルに作成日時等を含める
png(filename=paste(substitute(res), ".",
gsub(" ", "-", date()),".",i,".png",sep=""), width=240, height=24)
- 文字列の先頭、末尾、そして途中の引き続く空白を取り除く - from r-help, 2004.12.22
>x <- c("a b ", "dfhskf ", "FGF", "IUOI UOUO UOUO ")
> sub(" *$", "", x)
[1] "a b" "dfhskf" "FGF" "IUOI UOUO UOUO"
- データフレームの小計計算
aggregate(集計列,基準列,演算内容)で基準列ごとに集計列を演算します。基準列にベクトルを指定するとエラーが出ます(1列だけ指定するときもリストにします)。
>n<- c(3,4,1,9,6,9,6)
>m<- length(n)
>class <- rep(letters[1:m],n)
>grade <- sample(6,sum(n),rep=T)
>sansu <- sample(100,sum(n),rep=T)
>kokugo <- sample(100,sum(n),rep=T)
>aggregate(list(sansu=sansu,kokugo=kokugo),list(grade=grade,class=class),mean)
-
-