4

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 メソッドのディスパッチが発生したときに、新しい関数が確実に呼び出されるようにするにはどうすればよいですか?

4

1 に答える 1

4

試しましたassignInNamespace()か?

printAOV <- function(x, ...) print("replaced function!")
assignInNamespace("print.aov", printAOV, ns = asNamespace("stats"))

print(aov(yield ~ block + N * P + K, npk))
# [1] "replaced function!"
于 2015-01-22T21:46:03.783 に答える