R 用のツールに取り組んでいますが、パッケージ内の S3 メソッドを置き換える方法がわかりません。例を挙げてみましょうprint.aov
。本体を置き換えたいのですが、stats
名前空間内です。名前空間で関数を再割り当てするだけなら
> reassignInEnv <- function(name, obj, env) {
if (exists(name, env)) {
if (bindingIsLocked(name, env)) {
unlockBinding(name, env)
assign(name, obj, envir = env)
lockBinding(name, env)
} else {
assign(name, obj, envir = env)
}
} else {
stop("Object does not exist")
}
}
> reassignInEnv("print.aov", function(x, ...) { print("replaced function!") }, env = getNamespace('stats'))
新しいものではなく、以前に登録された関数がprint
ディスパッチ時に呼び出されます。
> print(aov(yield ~ block + N * P + K, npk))
Call:
aov(formula = yield ~ block + N * P + K, data = npk)
Terms:
block N P K N:P Residuals
Sum of Squares 343.2950 189.2817 8.4017 95.2017 21.2817 218.9033
Deg. of Freedom 5 1 1 1 1 14
Residual standard error: 3.954232
Estimated effects may be unbalanced
R.methodsS3パッケージも試しましたが、ロックされた環境で割り当てを実行しようとするため、機能しません。
> unlockBinding("print.aov", getNamespace('stats'))
> setMethodS3(name = "print", definition = function(x, ...) { print("replaced function!") }, class = "aov", private = TRUE, export = FALSE, envir = getNamespace('stats'))
Error in eval(expr, envir, enclos) :
cannot add bindings to a locked environment
S3 メソッドのディスパッチが発生したときに、新しい関数が確実に呼び出されるようにするにはどうすればよいですか?