Импортируйте метод S3 из пакета, который не определяет обобщенную функцию - PullRequest
0 голосов
/ 18 июня 2019

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

Более конкретно, мой пакет btergm (на CRAN и GitHub ) импортирует несколько функций из пакета ergm. Он также использует метод formula (определенный в ergm) обобщенной функции simulate (определенный в пакете methods). Я хотел бы импортировать этот метод из ergm. Как мне это сделать?

В другом месте я читал, что могу добавить зависимость к пакету ergm. Но я не хочу перемещать ergm из Imports: в Depends: в описании, потому что пакет btergm определяет свою собственную функцию gof, в то время как функция с таким именем также присутствует в пакете ergm , Это может вызвать предупреждение о том, что мой пакет перезаписывает функцию gof после загрузки ergm, а CRAN не любит предупреждения.

На данный момент работает без импорта. Однако пакет lme4 также определяет метод formula для универсальной функции simulate. Если кто-то загружает lme4 после загрузки ergm, мой код выбирает неправильный метод. Отсюда необходимость правильного импорта.

Текущая настройка в файле описания пакета btergm:

Imports: stats4, utils, methods, graphics, network (>= 1.13.0), sna (>= 2.3.2), ergm (>= 3.10.0), parallel, Matrix (>= 1.2.2), boot (>= 1.3.17), coda (>= 0.18.1), stats, ROCR (>= 1.0.7), speedglm (>= 0.3.1), igraph (>= 0.7.1), RSiena (>= 1.0.12.232), statnet.common (>= 4.2.0)
Suggests: 
    fastglm (>= 0.0.1),
    testthat
Depends: R (>= 3.5), xergm.common (>= 1.7.7), ggplot2 (>= 2.0.0)

И соответствующая часть из файла пространства имен:

import("methods")
...
importFrom("ergm", "ergmMPLE")
importFrom("ergm", "control.simulate.formula")
importFrom("ergm", "remove.offset.formula")
importFrom("ergm", "ergm.getnetwork")
importFrom("ergm", "ergm.getmodel")
importFrom("ergm", "ergm.Cprepare")
importFrom("ergm", "ergm.design")
importFrom("ergm", "ergm.pl")
importFrom("ergm", "control.ergm")
importFrom("ergm", "ergm.getglobalstats")
importFrom("ergm", "ergm.geodistdist")
importFrom("ergm", "ergm")
importFrom("ergm", "mcmc.diagnostics")

В пакете ergm экспорт пространства имен выглядит следующим образом:

S3method(simulate,formula)

Как мне импортировать это сейчас? Это importFrom("ergm", "simulate") или importFrom("ergm", "simulate.formula") или importFrom("ergm", "formula-method") или что-то совершенно другое? Раздел Writing R Extensions по определению импорта ничего об этом не говорит.

1 Ответ

0 голосов
/ 18 июня 2019

Общий simulate фактически определен в stats, а не methods.Если вы хотите убедиться, что метод simulate.formula из ergm найден, вам нужно убедиться, что пакет ergm загружен;ваш другой импорт из этого пакета будет гарантировать, что.

Однако, если lme4 будет загружен позже, его метод simulate.formula будет иметь приоритет, и вы получите сообщение типа

> library(lme4)
Loading required package: Matrix
Registered S3 method overwritten by 'lme4':
  method           from
  simulate.formula ergm

Если lme4 был загружен первым, вы, вероятно, получите предупреждение, когда ergm перезапишет его simulate.formula метод, и, вероятно, что-то в lme4 сломается.

Не так уж многоМожно сделать, чтобы предотвратить это: это слабость системы S3.

Идеальное решение для сопровождающих stats (R Core), ergm (Павел Н. Кривицкий) и lme4 (Бен Болкер), чтобы собраться вместе и решить, что должен делать simulate.formula, возможно, поместив его в stats, и один или оба других пакета затем переименуют свой метод.Это вряд ли будет быстрым.

Другая возможность - заставить сопровождающего ergm экспортировать метод, чтобы вы могли явно вызвать ergm::simulate.formula.

Для обходного пути,Вы можете определить свою собственную функцию, используя

simulate.formula <- ergm:::simulate.formula

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

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