Моя измененная версия функции пакета не может найти другие внутренние функции пакета - PullRequest
0 голосов
/ 30 октября 2018

Я сделал несколько специальных модификаций для функции в пакете metafor, скопировав код функции из Github и заменив функцию в моей среде , как описано здесь :

my.rma.uni = function(...) {
# here I simply copied the existing code with no modifications as a test
}

unlockBinding("rma.uni", as.environment("package:metafor"))
assign("rma.uni", rma.uni_mm, as.environment("package:metafor"))
lockBinding("rma.uni", as.environment("package:metafor"))

Но когда я пытаюсь запустить rma.uni, моя измененная версия не может найти другие внутренние функции metafor:

Error in .chkdots(ddd, c("knha", "scale", "link", "outlist")) : 
  could not find function ".chkdots"

Я также попытался просто вызвать my.rma.uni напрямую (что на самом деле было бы моим предпочтением, чтобы я мог одновременно иметь доступ к стандартному rma.uni и моей версии), но это выдает ту же ошибку.

Как я могу гарантировать, что моя измененная функция может получить доступ ко всем внутренним функциям?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Если вам нужна ваша функция для доступа к «частным» функциям из пространства имен, вы можете установить среду вашей функции. Обычно функции автоматически принимают среду, в которой они определены. Но вы можете программно изменить это.

Если вы просто сделаете

environment(my.rma.uni) <- as.environment("package:metafor")

Тогда функция my.rma.uni будет искать любые свободные символы в пространстве имен метафор, а не в глобальном пространстве имен. Вы можете сделать это, не связываясь с блокировкой / разблокировкой привязки и назначения в пространстве имен. Вам нужно только сделать то, что если вы хотите полностью заменить функцию в пакете. В большинстве случаев лучше создать собственную копию в глобальном пространстве имен.

0 голосов
/ 30 октября 2018

Для краткосрочного взлома я обычно просто получаю доступ к любым необходимым скрытым функциям через тройной двоеточие, например metafor:::.chkdots. Это громоздко (я обычно проверяю и исправляю их один за другим, когда они не работают) и не подходит для отправки в CRAN и т. Д., Но это работает для меня.

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