R

トップページ
Google
WWWを検索
サイト内を検索

Rのデータ入出力では、CSVファイルのように形式が定まったテキストファイルを用いることが多いと思いますが、UNIXライクなファイルI/Oを使うこともできますし、それを手軽にした関数もあります。

1 テキストファイルに書き出す

catを用いるとファイルを開いて閉じる作業なしに、テキストファイルに書き出すことができます。

cat(c("This is a pen!", "This is an apple"), file = "example.txt", sep ="\n")

fileを省略すると標準出力に、file = stderr()とすると標準エラー出力に書き出します1append = TRUEをつけると、ファイルを作り直さず追記します。 テキスト型のベクトルを出力できますが、標準では空白区切りの一行とされてしまうので、sep = "\n"を忘れないようにしましょう。 文字コードの指定はできないようです。

2 テキストファイルの内容を確認する

出力結果の確認でメモ帳を開く必要は無いです。別ウィンドウでテキストファイルの中身を見ることができます。

file.show("example.txt")

これはファイルの文字コード指定encodingをとることができます。

3 応答による画面表示をファイルに書き出す

bad-practice感あふれるのですが、sink関数で操作からの応答をファイルに書き出すことができます。

# 記録開始
sink(file = "example.txt", append = FALSE)
# summary(lm(y ~ x))
1:10
11:20
21:30
# 記録終了
sink()

なお、入力の方はsavehistory(file = "history.txt")で保存できます。

4 ファイルを読み込んで変更し、上書きする

fileでファイルを開いてファイルハンドルを取得し、読み書き操作の上で、closeでファイルを閉じる操作もできます。PerlやPythonと言ったスクリプト言語が得意な処理をしてみましょう。ファイルを読み込んで変更し、上書きします。前世紀に流行ったCGI2で一般的だった流れです3

# 読み書きモードでファイルを開く
con <- file("example.txt", "r+")
# 複数行まとめて読み出す
lines <- readLines(con)
# blocking=FALSEのときは全部一度で読み取るとは限らないので以下が要る
# while(isIncomplete(con)){
#   lines <- c(lines, readLines(con))
# }
# ファイルの読み書き位置を0地点に移動
seek(con, 0)
# ファイルサイズをゼロにする
truncate(con, 0)
# 1を001に置換して書き出す
writeLines(gsub("([^0-9])(1)([^0-9])", "\\100\\2\\3", lines), con)
# ファイルを閉じる
close(con)

?fileに詳しい説明がありますが、ファイルの第2引数のうちr(読み込み),w(書き込み),a(追記),r+(読み書き)を知っておけばだいたい間に合うと思います。なお、fileはURLを指定してネットワーク通信も可能で、C言語のfopenと比較すると格段に高機能な関数です。


  1. 標準エラー出力に出したい場合はmessageを使うほうが手っ取り早いでしょう。↩︎

  2. 標準入出力を利用したウェブサーバーの動的ページ作成システム。リクエストごとにプログラムを起動しオーバーヘッドやメモリー消費が大きいため、アクセス数が大きい大規模なシステムでは使われない。↩︎

  3. 標準ではflockが使えないので、CGIに用いることができません。↩︎