R с использованием s3 и s4 методов симуляции в одном пакете - PullRequest
5 голосов
/ 16 января 2012

Я озадачен ошибкой

found an S4 version of 'simulate' so it has not been imported correctly 

Я написал пакет R, который включает определение метода simulate () в качестве метода S3. Поскольку универсальный шаблон для имитации уже определен, я просто определяю simulate.myclass ( simulate.fitContinuous в моем случае).

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

Воспроизводимый пример путем извлечения пакета из github или do

require(devtools) 
install_github("pmc", "cboettig")
require(pmc)

Чтобы воспроизвести эту ошибку с нуля: Создайте новый пакет с минимальным файлом DESCRIPTION. включить ОПИСАНИЕ импорта: ой. Создайте NAMESPACE и добавьте import (ой) и S3method (симуляция, тест). Создайте каталог R, добавьте тривиальный скрипт R (я включил документацию roxygen, которая сгенерирует только что упомянутое NAMESPACE, но эту ошибку также можно создать без devtools / roxygen):

#' simulate
#' 
#' a test for s3/s4 conflicts
#' @param object who cares?
#' @param nsim guess.
#' @param seed yup
#' @param ... other parameters we will just ignore
#' @return something
#' @method simulate test
#' @S3method simulate test
#' @import ouch
simulate.test <- function(object, nsim = 1, seed = NULL, ...){
  message("This test worked")
}

Установите пакет (сначала документ с devtools, если хотите), и вы получите ошибку.

Мое лучшее решение на данный момент состоит в том, чтобы исключить строку S3method из NAMESPACE и вместо этого экспортировать полную функцию simulate.test. Это пройдет проверку и установку без предупреждений, но это явно худшее решение.

Другое решение состоит в том, чтобы иметь в наличии, а также импортировать, и правильно документировать метод S3 (как указано выше). Тогда все работает как положено, но предупреждающее сообщение остается.

1 Ответ

4 голосов
/ 16 января 2012

simulate является родовым S3, определенным в stats, поэтому в соответствии с разделом 1.6.2 «Написание расширений R» (пример не ясен - существуют исключения для дженериков, определенных в base),Файл NAMESPACE должен иметь

importFrom(stats, simulate)
S3method(simulate, fitContinuous)

Дело в том, что "найден метод S4", похоже, отражает, когда обнаружена проблема - попытка добавить методы S4 к универсальному S3, который не был виден ("it").«Я полагаю, что это родовой simulate).

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