Поскольку функция termplot
в R содержит какой-то странный код, который вызывает у меня досадные ошибки, я хочу переопределить его в своем собственном тестовом коде, пока не найду более постоянное решение. Проблема в том, что измененная функция не загружается пакетом mgcv
. Пакет mgcv
загружает termplot из пакета stats в его пространство имен, используя importFrom()
в файле NAMESPACE.
Как мне убедить mgcv использовать измененный термплот? Я попробовал:
unlockBinding("termplot", as.environment("package:stats"))
assign("termplot", my.termplot, as.environment("package:stats"))
lockBinding("termplot", as.environment("package:stats"))
и применительно к lm-объектам это работает, и используется измененный термплот. Но при использовании gam-объектов, созданных пакетом mgcv, это не работает. Я не собираюсь собирать пакет статистики из исходного кода, если смогу избежать этого ...
Чтобы уточнить, я тоже пытался с
assignInNamespace("termplot", my.termplot, ns="stats")
assignInNamespace("termplot", my.termplot, ns="mgcv")
во всех возможных комбинациях, до подключения mgcv, после подключения mgcv, и мне не удалось заставить его работать.
РЕДАКТИРОВАТЬ:
Я перепробовал все варианты, приведенные здесь (кроме перекомпиляции любого пакета), и не смог заставить его работать. Самый простой способ для меня - использовать функцию-обертку. Это обсуждение можно найти здесь . Спасибо за все советы.
Воспроизводимый пример:
my.termplot <- function (x) print("my new termplot")
unlockBinding("termplot", as.environment("package:stats"))
assignInNamespace("termplot", my.termplot, ns="stats", envir=as.environment("package:stats"))
assign("termplot", my.termplot, as.environment("package:stats"))
lockBinding("termplot", as.environment("package:stats"))
y <- 1:10
x <- 1:10
xx <- lm(y~x)
termplot(xx)
require(mgcv)
dat <- gamSim(1, n = 400, dist = "normal", scale = 2)
b <- gam(y ~ s(x0) + s(x1) + s(x2) + x3, data = dat)
plot(b,all=TRUE)
plot.gam
вызывает termplot для негладких терминов (в данном случае x3), но не может найти новую функцию termplot.
EDIT2: по-видимому, мой пример работает. Теперь я вижу, что решил свой собственный вопрос: в первом коде я не добавил ни пространства имен, ни пакета в assignInNamespace. Важно помнить, чтобы изменить функцию как в пространстве имен, так и в пакете, прежде чем загружать другой пакет. Спасибо @hadley за то, что он указал мне правильное направление, @Marek за то, что он проверил код и сообщил, что он работает, а остальное за то, что он попытался ответить.