Изменить внутреннюю функцию пакета
Немного предыстории:
Я должен использовать функцию 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
чтобы вернуть функцию обратно к оригиналу. Эти изменения не будут длиться дольше текущего сеанса.