R: как правильно переписать функцию из пакета?

Я использую пакет R, в котором есть 2 функции f1 и f2 (с вызовом f2 f1)
Я хочу перезаписать функцию f1.

Поскольку R 2.15 и обязательное использование пространства имен в пакетах, если я просто использую новую функцию, она действительно доступна в глобальной среде (т. Е. Простой вызов f1 (x) в консоли возвращает новый результат). Однако при вызове f2 все равно будет использоваться упакованная функция f1. (Поскольку пространство имен изменяет путь поиска и запечатывает его, как описаноздесь в Writing R Расширения руководство)
Как правильно полностью заменить f1 новым? (кроме сборки пакета заново!) Это может быть полезно в нескольких ситуациях. Например, если в пакете есть ошибка, которую вы не разработали. Или, если вы не хотите перестраивать свои пакеты каждый день, пока они находятся в стадии разработки.

Я знаю о функции

assignInNamespace("f1",f1,ns="mypackage")

Тем не менее, страница справки?assignInNamespace является немного загадочным и, кажется, отговаривает людей использовать его, не давая больше информации, и я не смог найти какие-либо рекомендации передовой практики на официальном учебнике по CRAN. и после вызова этой функции:

# Any of these 2 calls return the new function
mypackage::f1 
getFromNamespace(x = "f1", envir = as.environment("package:mypackage"))

# while this one still returns the old packaged version
getFunction(name = "f1", where = as.environment("package:mypackage")) 

Это очень тревожно. Как влияет путь поиска?

На данный момент я делаю некоторые уродливые вещи, такие как изменениеlockEnvironment функционировать так, чтобыlibrary не блокирует пространство имен пакета, и я могу заблокировать его на более позднем этапе после замены f1 (что на самом деле не очень хорошая практика)

Так что в основном у меня есть 2 вопроса:

что именно делаетassignInNamespace в случае пространства имен пакета (которое должно быть заблокировано)Каковы хорошие практики?

Большое спасибо за то, что поделились своим опытом.

РЕДАКТИРОВАТЬ: люди, заинтересованные в этом вопросе могут найтиэтот блог чрезвычайно интересно

Ответы на вопрос(1)

Ваш ответ на вопрос