Изменить внутреннюю функцию пакета

Немного предыстории:

Я должен использовать функцию HMR из пакета HMR много. К сожалению, эта функция очень медленная. (HMR это, по сути, подходящая функция, которая должна быть максимально надежной, что является одной из причин недостаточной эффективности.) Функция HMR функция вызова HMR::.HMR.fit1, что делает фактическую примерку. С помощью Rprof Я знаю, что основной проблемой в отношении эффективности является использование lsfit, который часто называют. Поэтому я изменил код .HMR.fit1 вызвать функцию C, используемую lsfit непосредственно без накладных расходов lsfit, что должно привести к значительному увеличению скорости.

Теперь я хотел бы заменить HMR::.HMR.fit1 с моей измененной функцией и тестом HMR если он даст те же результаты и сколько скорости я получу.

Я пытался сделать это:

mod.fun <- function(<many args>) {
 <a lot of code>
}
environment(mod.fun) <- environment(.HMR.fit1)
.HMR.fit1 <- mod.fun 

Тем не мение, HMR::.HMR.fit1 не изменяется при этом и, по-видимому, HMR::HMR не использует мою модифицированную функцию подгонки. Есть ли способ достичь того, чего я хочу, без сборки пакета из исходного кода, чего я не могу сделать из-за ограничений прав пользователя на моем (windows) компьютере?

Прямо сейчас, мое решение было бы скопировать код HMR::HMR, но я надеюсь, что есть более удобное решение.

2 ответа

Решение

Пытаться

?assignInNamespace

заменить .HMR.fit1 в HMR пакет с вашей версией.

Возможный дубликат:

Как переопределить невидимую функцию в пространстве имен пакета?

Для быстрого тестирования вы можете использовать trace функция с edit=TRUE чтобы изменить функцию, это сделает замену в правильном пространстве имен, а также позволит вам использовать untrace чтобы вернуть функцию обратно к оригиналу. Эти изменения не будут длиться дольше текущего сеанса.

Другие вопросы по тегам