R のセッションでコンソールに打ち込んだ入力、そして出力を後で点検、利用するための方法A
もし Unix 系の OS を使っているならば、tee 命令の利用が便利。R を起動する時次のようにすると、R セッション中のグラフィックスを除く、すべての入出力(つまりコンソールに現れるすべて)がファイル "R.log" (名前は任意だが、すでに存在するファイル名を指定すると、上書きされてしまうので注意)
R | tee R.log
tee は標準入力(この場合 R セッションでのコンソールへの出力をパイプ | を用いて tee 命令への出力に切替えている)を標準出力(普通はコンソール)を、同時に指定ファイルへ書き込む命令。既存のファイルに追記するにはオプション -a をつける。
R | tee -a R.log
R のバージョン 1.7 で付け加えられた新しい関数 capture.output() は、ある命令のグラフィックスを除くすべての出力を文字列に変換する。一行が一つの文字列に変換される。
> t=capture.output( t.test( rnorm(10), rnorm(10, 2) ) ) > t [1] "" [2] "\tWelch Two Sample t-test" [3] "" [4] "data: rnorm(10) and rnorm(10, 2) " [5] "t = -4.9303, df = 17.535, p-value = 0.0001162" [6] "alternative hypothesis: true difference in means is not equal to 0 " [7] "95 percent confidence interval:" [8] " -2.943190 -1.182000 " [9] "sample estimates:" [10] " mean of x mean of y " [11] "-0.01055496 2.05204024 " [12] ""
example() 関数の出力も扱える
> glmexample <- capture.output(example(glm)) > glmexample [1] "" [2] "glm> counts <- c(18, 17, 15, 20, 10, 20, 25, 13, 12)" [3] "" [4] "glm> outcome <- gl(3, 1, 9)" (以下省略)
Unix の enscript 命令を使うと、直接ポストスクリプトファイルに変換もできる(らしいが、エラーとなる?)
capture.output(example(glm), file=pipe("enscript -o tempout.ps","w"))
Unix で広く使われている高機能エディタ (X)Emacs にはシェルモード(命令 Esc-x shell で起動)と呼ばれる端末モードがある。これは Emacs の一つのバッファであることを除けば、R を起動する等、普通の端末と同じように扱え、過去に遡るコンソールへの入出力がすべて記録され、スクロールすることにより閲覧できる。R コード*1や原稿を (X)Emacs で編集中に使うと、便利である。 あるファイルの中身は Esc-x insert-file 命令を使えば、編集中のバッファにそのまま挿入できる。
同様の操作は ESS でも可能.こちらの方が統計環境に特化している分高機能である.
R の命令 sink() は R のコンソール出力の出力先を変更する。最も普通の使い方は、出力をディスクファイルに記録することである。ただし、その間コンソールには何も表示されないので、忘れずに引数なしの sink() で出力をまたコンソールに戻しておかないと慌てることになる。
> sink(file = "foo.doc") # 出力をファイル "foo.doc" に書き込む # 既定では既存のファイルであれば上書きしてしまう > sink(file = "oldfoo.doc", append = TRUE) # 既存のファイルに追記 > sink() # (引数無し) 出力を再びコンソールに切替え
※コンソールとファイルの両方に同時出力するためには、引数にsplit = TRUE を追加する。*2 ※sink()コマンドの問題点は、コマンドの実行結果のみがファイルに記録され、コマンドそのものは記録されないことである。 これを回避する一つの方法は、実行したいコマンドの直前で次のように
> cat("実行したいコマンドの名前などを入れる\n")
cat()コマンドを用いて、記録する。
sink() の便利な使い方は、インタラクティブに定義した関数を保管のためにファイルに書き込むことである。
> myfun <- function(x) {............} # 関数定義 > sink(file = "myfun.R", append = TRUE) # 出力を追記モードでファイルに切替え > myfun # 関数定義内容を出力 > sink() # 出力をコンソールに戻す
お手軽な方法として、X window のマウスによる copy, paste 機能を使う方法がある。スクロールバー付きの端末を使えば、過去に遡ってコンソール出力を見ることができるので便利。ファイルの中身も less 等のページャソフトでコンソールに出力すれば、この手が使える。
(すぐに Linux に切替える(冗談)。私は使ったことが無いので、特にお勧めの方法があれば、誰か補足して下さい)
> library(TeachingDemos) #予めパッケージをインストールしておく必要あり > txtStart("ここに出力ファイル名.txt", commands = TRUE, results = TRUE, append = FALSE) > #ここに記録すべきコマンド > txtStop() #引数なし、このコマンドでファイルへの出力の終了Windows版GUIのRで動作確認済み。*3
R --save <command.R >commandlog.txtでcommandlog.txtにログを全てとることができます。
R | tee R.logも使える。
R --save <command.Rと実行することでもlogファイルの作成が可能です。-- のの 2010-09-01 (水) 06:22:26
R のグラフィックスを適当な画像形式で保存する基本は postscript() デバイス関数等の画像ファイル出力専用の関数を使うことである。
data(Titanic) # ポストスクリプトデバイスを開く。出力 EPS ファイル名を指定 # horizontal=FALSE を指定しないと、LaTeX に取り込んだ時横にひっくり返る postscript("mosaicplot.eps", horizontal=FALSE, height=9, width=14, pointsize=15) mosaicplot(Titanic, main = "Survival on the Titanic", color = TRUE) dev.off() # 必要な出力がすべて終ったら、すぐにデバイスを閉じるのがコツ
recordPlot() は現在アクティブなデバイスに表示されたグラフィックスの作図手順を記録するための関数である。記録された手順は、別種のデバイスにたいして(も) replayPlot() 関数で再現できる。
> plot(1:10, rinif(10)) # X11 画面への出力 > pp <- recordPlot() # (引数無し) 現在の X11 画面のグラフィックス作図手順の記録 > pp # 何も表示されない #(大量の可読性の低い内容なのでコンソールには表示されないようにしてある) > postscript("pp.eps") # ポストスクリプトデバイスを開く > replayPlot(pp) # pp の内容を現在のデバイス(ポストスクリプト)で再現 > dev.off() # デバイスを閉じる(これを忘れると悩むことになる) > png("pp.png") # 今度は png デバイスを開く > replayPlot(pp) # pp の内容を現在のデバイス(png デバイス)で再現 > dev.off() # png デバイスを閉じる
dev.print() は現在アクティブなグラフィックスデバイス(例えば X11)に出力されたグラフィックスを、他のグラフィックスデバイス (既定では postscript) に再出力する。
> X11() # X11 デバイスを開く > plot(rnorm(10), main="Plot 1") # X11 デバイスに出力 > dev.print(file="ss.eps",width=6, height=6, horizontal=FALSE) # 既定で EPS ファイルに出力 > dev.copy2eps(file="ss.eps",width=6, height=6, horizontal=FALSE) # 同じ(EPS 出力専用)
注意:pdf, pictex, png, jpg 等の他のデバイスにも再出力可能らしいが未確認。
お手軽な方法は スクリーンキャプチャ と呼ばれるソフト *4 を使って既定の X11 デバイス画面そのものを画像ファイルに落してしまうことである。ただし、ウィンドウの枠まで記録されてしまうこと、この画像は文字、グラフィックス要素等がビットマップとして記録されており、拡大・縮小すると汚くなるのは致し方ない。
書式: bmp(filename = "graphic.bmp", width = 480, height = 480, pointsize = 12, bg = "white", res = NA, restoreConsole = TRUE) jpeg(filename = "graphic.jpg", width = 480, height = 480, pointsize = 12, quality = 75, bg = "white", res = NA, restoreConsole = TRUE) png(filename = "graphic.png", width = 480, height = 480, pointsize = 12, bg = "white", res = NA, restoreConsole = TRUE) ちなみに、bmp(),jpeg(),png()といった作図関数のことをデバイスドライバと呼ぶようです。 (参考:http://takenaka-akio.cool.ne.jp/doc/r_auto/chapter_04.html)
引数: filename: 出力先(作成する)ファイル名 ※未記入だと「Rplot001.png」などのように順番にファイル名をインクリメントして書き出してくれます。 width: 画像の幅(pixel数?) height: 画像の高さ(pixel数?) pointsize: プロットのポイントの大きさ(pixel数?) bg: 背景の色 quality: JPEGの画質(%):画質が低いと画像がぼんやりします。 res: BMPで保存される場合のnominal resolution in dpi ? restoreConsole: See the Details section of windows ?
使用例: png("test.png", width = 480, height = 480, pointsize = 12, bg = "white", res = NA, restoreConsole = TRUE) #デバイスドライバの用意 plot(1:10) #グラフを描画 dev.off() #デバイスを閉じる
注意: (1)画像の幅と高さ(widthとheight)の単位はinchでなくpixelです。 20未満の数値を入力してしまうと警告されます。 (2)起動したデバイスは、dev.off()で閉じないと画像ファイルがきちんとできないことがあるようです。
ほとんど上記のPNGと同じ使い方で、win.metafile(filename="hoge.wmf");plot(hoge);dev.off()とすることで保存できます。出力したウインドウズメタファイルの画像はEMF形式同様に、Ooo DrawやMS power pointなどでグループ解除することで図形データとして修正することもできます。詳しくは?win.metafileで。(2009/1/3追記)
特定のオブジェクトをファイルへ記録数するには save() 関数を使う。但し、記録は内部形式で行なわれ、エディタで見ることはできない。load() 関数を用いて元に戻すことができる。
> x <- runif(10) > y <- c("abc", "def") > save(x, y, file="xy.data") # 二つのオブジェクトをファイル "xy.data" に記録 > rm(x, y) # オブジェクトを消す > ls() character(0) # 消えた > load("xy.data") # 再読み込み > ls() [1] "x" "y" # 復元されている
あるセッションのすべてのオブジェクトを、他のワークスペースへの引越し。
> save(list = ls(), file= "all.Rdata") # すべてのオブジェクトの記録 > load("all.Rdata") # 現在のワークスペースへの復元 > load("all.Rdata", .GlobalEnv) # ユーザーワークスペースへの復元
> x = matrix(1:12, ncol=3) > x [,1] [,2] [,3] [1,] 1 5 9 [2,] 2 6 10 [3,] 3 7 11 [4,] 4 8 12 > write(x, file="x.data") > scan("x.data") # scan 関数で再読み込み(結果はベクトルになっている) Read 12 items [1] 1 2 3 4 5 6 7 8 9 10 11 12 > xx = matrix(scan("x.data"), ncol=3) # また行列に変換 Read 12 items > xx [,1] [,2] [,3] [1,] 1 5 9 [2,] 2 6 10 [3,] 3 7 11 [4,] 4 8 12
ちなみに、ファイル x.data は次のように数値の場合既定で一行に5個(文字は一文字ずつ)記録される。行列 x に対しては write(t(x), file="x.data", ncolumns=ncol(x)) とすれば、ファイルの数字の並びが本来の行列 x と同じになる。
1 2 3 4 5 6 7 8 9 10 11 12
注意:ファイルそのものを直接編集したいのでなければ、次のようにするほうが x の構造を直接記録してくれるので世話がない。
> save(x, file="temp.data") # ファイル temp.data はテキストデータではない! > rm(x) > load("temp.data") # オブジェクト x が復元される
注意:paste(z) は数値を文字列に変換する裏技 (as.character(z) でも良い)
注意:writwLines 関数は既定で文字列の最後に "\n" (改行コード)付け加える。例えばwriteLines(paste(z), sep=",\n") とすれば行末にカンマを加え(改行する)。
注意:複数のファイルを同時に開いている場合は writeLines(paste(z),con=fout2) 等と書き込み接続を指定する。
fout <- file("./c:/test.txt", "w") # ファイルを書き込みモードで開く(MSW 風指定) x <- 5 for (i in 1:10) { z <- x + i writeLines(paste(z), fout) # z を文字列としてテキスト(の一行として)に書き込み } close(fout) # ファイルを閉じる
オブジェクト名もそのまま記録される。 ただし現在のところ、関数と簡単なベクトル以外では支障がおきる可能性がある。
x <- 1; y <- 1:10 dump(ls(patt='^[xyz]'), "xyz.Rdmped") #x,y,z で始まるオブジェクトをファイル "xyz.Rdumped" に書き込み rm(x, y) unlink("xyz.Rdmped") # ファイルへの接続の切断 load("xyz.Rdumped") # 再読み込み
オブジェクト名は記録されない
## 関数 mean をアスキー形式でファイル "foo" に書き込む dput(mean, "foo") ## それを bar という名前で再読み込み bar <- dget("foo") unlink("foo")
Rパッケージ evaluate はRの実行過程の結果を逐一リストオブジェクトに 記録し,後から再現できるようにする.画像も記録復元できる.これを用いた Rの実行デモ用の関数については Rのデモ用の関数 を参照.