R Advent Calendar 2014 の初日の dichika 氏『有意差でたよっ』からネタを拝借します。
せっかくセリフが「有意差でたよっ」なので,本当に有意差が出たときにしゃべっていただきたい。より具体的には, t.test を行った結果,有意差が認められた場合に「有意差でたよっ」と言ってもらいます。
まずオリジナルの t.test を持ってきます。簡単のために数値ベクトルを受け取る t.test.default を取得します。
tt <- stats:::t.test.default
t.test.default の中身を見てみましょう。
print(tt)
# 前略
rval <- list(statistic = tstat, parameter = df, p.value = pval,
conf.int = cint, estimate = estimate, null.value = mu,
alternative = alternative, method = method, data.name = dname)
class(rval) <- "htest"
return(rval)
}
最後に rval という値を返していることがわかります。この直前に有意差判定を行い,有意ならしゃべってもらえばよさそうです。そこで最後の return の直前に,以下の文を挿入することにします。
if (rval$p.value < 0.05) yeah::detayo()
これを挿入するには,関数の body に対して quote して挿入すればよいです。
tt.body <- body(tt) ret <- tt.body[[length(tt.body)]] tt.body[[length(tt.body)]] <- quote(if (rval$p.value < 0.05) yeah::detayo()) tt.body[[length(tt.body) + 1]] <- ret body(tt) <- tt.body
これで tt の最後の処理の直前に detayo が挿入された状態になりました。
この tt を元の stats 名前空間に戻してやりましょう。
assignInNamespace("t.test.default", tt, getNamespace("stats"))
後は普通に t.test を呼べば OK です。
set.seed(123L) t.test(rnorm(10, 3))