Подтвердить что ты не робот

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

Некоторая предыстория:

Мне нужно многократно использовать функцию 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, но я надеюсь, что есть более удобное решение.

4b9b3361

Ответ 2

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