2012-08-29 3 views
13

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

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

ответ

12

Попробуйте

?assignInNamespace 

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

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

How do I override a non-visible function in the package namespace?

+0

Если вы хотите * добавить * новую функцию вместо изменения старого, используйте это решение: http://stackoverflow.com/a/3402159/684229 – TMS

6

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

Смежные вопросы