Поскольку функция termplot
в R содержит некоторый странный код, который дает мне раздражающие ошибки, я хочу переопределить его в своем собственном тестовом коде, пока не найду более постоянное решение. Проблема в том, что измененная функция не загружается пакетом mgcv
. Пакет mgcv
загружает termplot из пакета статистики в своем пространстве имен, используя 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 для тестирования кода и сообщения об этом работает, а остальное - для ответа.