diff コマンドを利用してプログラムの正しさをチェックします。
$ > diff answer out ● answer 期待される出力結果のファイル ● out 実際の出力結果のファイル
chmod 755 check などで実行可能としておく
#!/bin/sh -f R --vanilla --silent --slave < tests.R diff answer out
注1:tests.R は,以下に示す R スクリプト
注2:answer は,期待される出力のファイル(一文字単位で正確なもの)
注3:out は,開発中の関数が出力する結果が納められるファイル(実行のたびに作られる)
ファイル名は tests.R としておく (1) の中の名前と対応付け
source("my.oneway.ANOVA.R") # my.oneway.ANOVA.R は,開発中のスクリプト---(3)を参照 test <- function() # テストの記述 { sink("out") # 以下の結果を out という名前のファイルに書き出す print(my.oneway.ANOVA(c(8, 11, 22, 6), c(135.83, 160.49, 178.35, 188.06), c(19.59, 12.28, 15.01, 9.81)^2)) print(my.oneway.ANOVA(c(8, 11, 22, 6), c(135.83, 160.49, 178.35, 188.06), c(19.59, 12.28, 15.01, 9.81)^2, equal=FALSE)) sink() # 書き出し終了 } test() # 実際にテストを実行する
ファイル名は my.oneway.ANOVA.R としておく (2) の中の名前と対応付け
my.oneway.ANOVA <- function(n, m, u, equal=T) { ng <- length(n) if (equal) { # 分散が等しいと仮定する場合 nc <- sum(n) sw <- sum(u*(n-1)) sb <- sum(n*(m-sum(n*m)/nc)^2) ss <- c(sb, sw, sb+sw) df <- c(ng-1, nc-ng, nc-1) ms <- ss/df f <- p <- rep(99999, 3) f[1] <- ms[1]/ms[2] p[1] <- pf(f[1], df[1], df[2], lower = F) anova.table <- cbind(ss, df, ms, f, p) colnames(anova.table) <- c("SS", "d.f.", "MS", "F value", "P value") rownames(anova.table) <- c("between class", "within class", "total") anova.table } else { # 分散が等しいと仮定しない場合 w <- n/u m0 <- sum(w*m)/(sum.w <- sum(w)) temp <- sum((1-w/sum.w)^2/(n-1))/(ng^2-1) f <- sum(w*(m-m0)^2)/((ng-1)*(1+2*(ng-2)*temp)) p <- pf(f, ng-1, 1/(3*temp), lower=F) list(F=f, df1=ng-1, df2=1/(3*temp), P=p) } }
前もって作っておく
キーボードから入力する必要はない。
できかけの関数が書き出す結果をファイルに出力し,必要なら微修正すればよい。
SS d.f. MS F value P value between class 13669.396 3 4556.4655 20.82824 1.737484e-08 within class 9406.843 43 218.7638 99999.00000 9.999900e+04 total 23076.240 46 501.6574 99999.00000 9.999900e+04 this line may be displayed. $F [1] 17.56461 $df1 [1] 3 $df2 [1] 16.50403 $P [1] 2.191921e-05
(1) で定義するシェルスクリプトにより起動される(2)の R スクリプト中の test 関数が出力する結果
SS d.f. MS F value P value between class 13669.396 3 4556.4655 20.82824 1.737484e-08 within class 9406.843 43 218.7638 99999.00000 9.999900e+04 total 23076.240 46 501.6574 99999.00000 9.999900e+04 $F [1] 17.56461 $df1 [1] 3 $df2 [1] 16.50403 $P [1] 2.191921e-05
(1) で作ったシェルスクリプトを実行する。
$ > ./check 5d4 < this line may be displayed. # 違いのある行が表示される