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()
とすると標準エラー出力に書き出します1。append = 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。
# 読み書きモードでファイルを開く
<- file("example.txt", "r+")
con # 複数行まとめて読み出す
<- readLines(con)
lines # 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
と比較すると格段に高機能な関数です。