R のセッションでコンソールに打ち込んだ入力、そして出力を後で点検、利用するための方法A


テキスト出力の記録

Unix の tee 命令の利用

もし Unix 系の OS を使っているならば、tee 命令の利用が便利。R を起動する時次のようにすると、R セッション中のグラフィックスを除く、すべての入出力(つまりコンソールに現れるすべて)がファイル "R.log" (名前は任意だが、すでに存在するファイル名を指定すると、上書きされてしまうので注意)

R | tee R.log

tee は標準入力(この場合 R セッションでのコンソールへの出力をパイプ | を用いて tee 命令への出力に切替えている)を標準出力(普通はコンソール)を、同時に指定ファイルへ書き込む命令。既存のファイルに追記するにはオプション -a をつける。

R | tee -a R.log

R の capture.output 関数の利用

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"))

(X)Emacs のシェルモードを利用する

Unix で広く使われている高機能エディタ (X)Emacs にはシェルモード(命令 Esc-x shell で起動)と呼ばれる端末モードがある。これは Emacs の一つのバッファであることを除けば、R を起動する等、普通の端末と同じように扱え、過去に遡るコンソールへの入出力がすべて記録され、スクロールすることにより閲覧できる。R コード*1や原稿を (X)Emacs で編集中に使うと、便利である。 あるファイルの中身は Esc-x insert-file 命令を使えば、編集中のバッファにそのまま挿入できる。

同様の操作は ESS でも可能.こちらの方が統計環境に特化している分高機能である.

sink 命令

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 機能

お手軽な方法として、X window のマウスによる copy, paste 機能を使う方法がある。スクロールバー付きの端末を使えば、過去に遡ってコンソール出力を見ることができるので便利。ファイルの中身も less 等のページャソフトでコンソールに出力すれば、この手が使える。

MS Windows ユーザーは

(すぐに Linux に切替える(冗談)。私は使ったことが無いので、特にお勧めの方法があれば、誰か補足して下さい)

  • 補足2010/09/16 windowsのGUI版で、Rを出力する一つの解決策は、TeachingDemosパッケージのtxtStart()を使うことです。TeachingDemosは標準パッケージではありませんが、オンラインであれば、Rから簡単にインストールできます。使い方は次の通りです。
    > library(TeachingDemos) #予めパッケージをインストールしておく必要あり
    > txtStart("ここに出力ファイル名.txt", commands = TRUE, results = TRUE, append = FALSE)
    > #ここに記録すべきコマンド
    > txtStop() #引数なし、このコマンドでファイルへの出力の終了
    Windows版GUIのRで動作確認済み。*3
  • 補足2009/1/2 windowsでもsink()が使えます。例えば回帰分析の結果の画面表示を出力したい場合には、sink("hoge.txt")で出力先のテキストを指定してから、print(summary(lm(y~x)))とすればhoge.txtにsummaryで画面出力される内容が保存されます。複数同じファイルに追記したい場合にはsink("hoge.txt",append=T)とします。出力が終わったらsink()として画面出力にもどしましょう。他に便利な方法があればどなたか、補足修正お願いします。
  • RGuiなら、ファイル→「ファイルの保存」でログがテキストファイルとして保存される。コマンドのみのを保存したい場合はファイル→「履歴の保存」でテキストファイルとして保存できる。 -- 2010-05-19 (水) 12:53:27
  • 問題は、出力結果は記録されますが、コマンドそのものは記録されないことですね。何かプラットフォームに依存しない良い方法はないものでしょうか? -- のの 2010-09-01 (水) 06:12:37

Macintosh ユーザーは

  • コンソールからコピー&ペースト
  • GUI版のRならメニュー>保存かcommand+Sでコンソールの内容をそのまま保存できる(MacのGUI版Rはコンソールの内容がかなり大きくても保存されている)。
  • ターミナルからRが起動できる環境なら、command.Rというコマンドを書いた拡張子が.Rというテキストファイルを準備すれば、
    R --save <command.R >commandlog.txt 
    でcommandlog.txtにログを全てとることができます。
  • もちろん
    R | tee R.log
    も使える。
  • R --save <command.R >commandlog.txt はコマンド終了後自動でRをquitします。 -- のの
  • 拡張子が.Rのテキストエディタに、library(TeachingDemos.R)とtxtStartコマンドを書いて、
     R --save <command.R
    と実行することでもlogファイルの作成が可能です。-- のの 2010-09-01 (水) 06:22:26
  • OSX用のRStudioを使う方法もいいね。 -- のの 2011-05-24 (火) 15:54:24
  • 久しぶりにTeachingDemosをチェックしたらVersionが2.8になっていて、MacのGUI版でもちゃんとコマンドも結果も記録されていた。エラーの出たコマンドは記録されていなかったけど、設定次第なのかな?とりあえず、WinでもMacでも同じ環境が整って、講義には便利かも。 -- のの 2012-09-12 (水) 17:07:19

グラフィックス出力の記録は?

postscript() デバイス

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()

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()

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 JPEG and PNG 形式でのグラフの出力(保存)

書式:
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()で閉じないと画像ファイルがきちんとできないことがあるようです。

MS Windowsでベクター形式(WMFファイル)でのグラフの出力(保存)

ほとんど上記のPNGと同じ使い方で、win.metafile(filename="hoge.wmf");plot(hoge);dev.off()とすることで保存できます。出力したウインドウズメタファイルの画像はEMF形式同様に、Ooo DrawやMS power pointなどでグループ解除することで図形データとして修正することもできます。詳しくは?win.metafileで。(2009/1/3追記)

オブジェクトの記録は

特定のオブジェクトのディスクファイルへの記録。save(), load() 関数

特定のオブジェクトをファイルへ記録数するには 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)       # ユーザーワークスペースへの復元

データオブジェクトのテキストファイルへの記録。 write() 関数

  • 書式 write(x, file = "data", ncolumns = if(is.character(x)) 1 else 5,append = FALSE)
  • 引数
    • x: 書き出すデータ
    • file: 接続、もしくはファイル名を表す文字列。もし空文字列 "" なら標準出力に出力。
    • ncolumns: 一行に書き出すデータの個数 (既定値は数値なら5、文字なら1)
    • append: もし 'TRUE' ならデータはファイルに追記される。
> 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 が復元される

プログラムの出力を順次指定ファイルに書き込む writeLines() 関数 (2004.2.4)

注意: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)  # ファイルを閉じる

オブジェクトを再現可能な表現でファイルにテキストファイルとして書き込む dump() (2004.4.10)

オブジェクト名もそのまま記録される。 ただし現在のところ、関数と簡単なベクトル以外では支障がおきる可能性がある。

  • 書式 dump(list, file = "dumpdata.R", append = FALSE, envir = parent.frame())
  • 引数
    • list 文字列。一つ以上の R オブジェクト名
    • file 書き込み先ファイルもしくは接続名
    • append もし TRUE なら追記、FALSE なら上書き
    • envir オブジェクトを探すべき環境 : the environment to search for objects.
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")  # 再読み込み

オブジェクトをファイルにテキストファイルとして書き込む dput, dget (2004.4.10)

オブジェクト名は記録されない

  • 書式
    • dput(x, file = "")
    • dget(file)
    ## 関数 mean をアスキー形式でファイル "foo" に書き込む
    dput(mean, "foo")
    ## それを bar という名前で再読み込み
    bar <- dget("foo")
    unlink("foo")

Rの実行過程を記録し,再現する

Rパッケージ evaluate はRの実行過程の結果を逐一リストオブジェクトに 記録し,後から再現できるようにする.画像も記録復元できる.これを用いた Rの実行デモ用の関数については Rのデモ用の関数 を参照.


*1 (X)Emacs の統計言語用のリスプライブラリであるESS は S,R をサポートしており、併用するとコードの編集がとても便利になる
*2 何故かWindows環境ではsplitが上手く働かなかったが、詳細な検証は行っていないので情報があれば教えて下さい。byのの
*3 Macではターミナル版Rでは上手くできるが、GUI版ではファイルは作られるが中身の出力がない。バグなんだろうか?情報求む。byのの
*4 例えば Linux の KDE デスクトップには KSnapshot と呼ばれるソフトが組み込まれており、簡単にグラフィックス画面を png ファイルに記録できる。ただし、枠等の余分なものも一緒に記録されてしまう。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2015-03-01 (日) 01:15:59 (1720d)