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))