Когда я не должен использовать assignInNamespace? - PullRequest
2 голосов
/ 27 сентября 2019

У меня есть сценарий использования, где я временно хочу перезаписать package:::function() для тестов или потому, что я буду использовать функцию только один раз по-новому.

Я нашел assignInNamespace, который выполняет эту работу,например,

joke <- function(...) {return("hurz")}
assignInNamespace(x = "add1.glm", value = joke, pos = "package:stats")
stats:::add1.glm()
# [1] "hurz"

Но документы ??assignInNamespace из пакета utils state

Предупреждение: assignInNamespace не должен использоваться в конечном коде, и в будущем выдает ошибку, еслизвонил из пакета. Уже определенные виды использования запрещены.

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


Редактировать : Я думал, что это повлияет в основном на мои собственные пакеты.

Ответы [ 2 ]

3 голосов
/ 27 сентября 2019

Если вы хотите сделать это для целей тестирования, вам лучше использовать trace(stats:::add1.glm, edit = TRUE).Это позволит вам временно заменить тело функции любым кодом, который вы хотите, и untrace(stats::add1.glm) восстановит оригинал.Существует небольшая вероятность того, что trace() будет удалено или радикально ограничено в будущем.

Вы не должны пытаться делать это в рабочем коде по причинам, указанным Конрадом.

2 голосов
/ 27 сентября 2019

Неэкспортированные функции - это функции, которые не являются частью открытого интерфейса пакета.Это означает, что пакет не дает никаких гарантий о

  1. способе вызова этой функции и
  2. о том, будет ли эта функция по-прежнему существовать и не изменится в будущих версиях пакета.

Это означает, что использование такой функции (включая ее переопределение) будет случайным образом прерываться.Вот почему его использование в пакетах запрещено: вы не можете гарантировать, что он продолжит работать.

При этом, если вы используете его только в целях тестирования в строго контролируемых обстоятельствах, риск можетбыть действительным компромиссом.Тем не менее, сначала подумайте, есть ли менее навязчивые и хрупкие решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...