R における文芸的プログラミング(データ、解説、処理コードの融合)
(r.help に対する G. Grothendieck の投稿記事より。2003.6.16)
R で処理すべき(複数)データ、それらの記述、更に読み込んだ変数を使った処理コード、を一つのファイルにまとめ、そのファイルを source() 関数で読み込むだけで実行する欲張りな方法。意外に役に立つかも。
次のようなファイルを現在のディレクトリに、名前 "temp.R" で作成し、R から
> source("temp.R")
を実行すると、変数 x, y, z がファイル内で与えたデータ内容で作成される。ついでに、それらの変数を用いたコードも自動的に実行できる。実行コードは、それが処理するすべての変数が読み込まれた後に置かねばならないが、任意の位置(例えば先頭)に置いても source("temp.R") を二度実行すれば良い様である(?)。
############## start of sample file ####################### myFile <- "./temp.R" # source 関数で読み込まれるべきこのファイルの名前 my.stdin <- function( filename, tag ) # 補助関数定義 (必須) textConnection( sub(tag, "", grep(tag,readLines(filename),value=T)) ) # 行先頭が #x で始まるすべての行をデータフレーム変数 x に代入 (ヘッダー付き) # x データの解説:このデータには何の意味もない! x <- read.table( my.stdin(myFile,"^#x"), header=T ) # x データを読み込む命令 #x Sex Response # ヘッダー行 #x Male 1 #x Male 2 #x Female 3 #x Female 4 # 行先頭が "#ay" で始まるすべての行をデータフレーム変数 z に代入(ヘッダー無し) y <- read.table( my.stdin(myFile,"^#ay") ) # y データを読み込む命令 #ay 3.4 4 #ay 3 3 #ay 6 6 ################################# # y データの解説:このデータも無意味!# ################################# # 行先頭が "#z" で始まるすべての行をベクトル変数 z に代入 ################################## # z データの解説:これは等差数列である # ################################## z <- scan( my.stdin(myFile,"^#z") ) # z データを読み込む命令 #z 1 2 3 4 5 6 #z 7 8 #ay 6 6 # y データの最後 (バラバラに書いても現れた順に読み込まれる) # データを使ったコード (やはり変数を読み込んだ後でないと駄目) cat(mean(z), "\n") ############# end of sample file #######################